2010-09-30 78 views
3

我有这样一个简单的问题,我觉得很蠢。我不敢相信我在这件事上碰到了我的头。在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) 

我在做什么错?我不相信我甚至会问这个问题。

回答

3

第一个查询将日期与编号为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任何记录。

+0

我的解决方案可能会更加灵活,而不是使用1天,但我想这取决于他如何执行SQL – hunter 2010-09-30 17:50:23

2

与此类似,也注意安全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 
1

我建议你使用DATEDIFF

SELECT * FROM Orders WHERE DATEDIFF(d, [DateOrdered], '20100601') = 0