在SQL Server 2005中按日期/时间查询
问题描述:
我有这样一个简单的问题,我觉得很蠢。我不敢相信我在这件事上碰到了我的头。在SQL Server 2005中按日期/时间查询
我有一个名为“订单”的表。 “订单”有一个名为“DateOrdered”的小日期时间字段。我需要在特定日期获得所有“订单”。我试过以下没有任何成功:
SELECT * FROM Orders WHERE [DateOrdered]=2010-06-01
SELECT * FROM Orders WHERE [DateOrdered]='2010-06-01'
SELECT * FROM Orders WHERE [DateOrdered]=CAST('2010-06-01' AS smalldatetime)
我在做什么错?我不相信我甚至会问这个问题。
答
第一个查询将日期与编号为2003
(2010减6减1)的日期进行比较,该日期转换为日期'1905-06-27'
。第二个和第三个查询将对确切的日期值(即00:00时间分量)起作用,并且是等同的。
在smalldatetime值中是否有时间组件?在这种情况下,你可以在一个区间得到的值:
SELECT * FROM Orders WHERE DateOrdered >= '2010-06-01'
and DateOrdered < '2010-06-02'
注意使用>=
和<
代替between
关键字,以排除可能具有精确值2010-06-02
任何记录。
答
与此类似,也注意安全ISO日期格式(年月日),这将不会炸毁如果你是在以英国为例
SELECT * FROM Orders WHERE [DateOrdered] >='20100601'
AND [DateOrdered] < '20100602'
这样也将使你使用一个索引,如果你投的DateOrdered列的索引将不会被使用
这里是当你使用YYYY-MM-DD,而不是YYYYMMDD
会发生什么情况为例SET LANGUAGE 'us_english'
SELECT CONVERT(DATETIME, '2006-04-06'), --will be YMD
CONVERT(DATETIME, '20060406') --safe format
SET LANGUAGE 'Italian'
SELECT CONVERT(DATETIME, '2006-04-06'), --will be YDM
CONVERT(DATETIME, '20060406') -- safe format
答
我一直用这个帖子记住如何圆一个DATETIME为“DATE”为SQL2005和更早版本: Best approach to remove time part of datetime in SQL Server
我的解决方案可能会更加灵活,而不是使用1天,但我想这取决于他如何执行SQL – hunter 2010-09-30 17:50:23