在SQL Server 2005中按日期/时间查询

时间:2010-09-30 17:39:17

标签: sql sql-server sql-server-2005 tsql

我有这么简单的问题,我觉得这很愚蠢。我简直不敢相信自己会对此感到震惊。

我有一张名为“订单”的表格。 “Orders”有一个名为“DateOrdered”的smalldatetime字段。我需要在特定日期获得所有“订单”。我试过以下但没有成功:

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)

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

4 个答案:

答案 0 :(得分: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的记录。

答案 1 :(得分:2)

像这样,还要注意安全的ISO日期格式(YYYYMMDD),如果您在英国,它将不会爆炸

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

答案 2 :(得分:1)

我总是使用这篇文章来记住如何将DATETIME舍入到SQL2005及更早版本的“DATE”: Best approach to remove time part of datetime in SQL Server

答案 3 :(得分:1)

我建议您使用DATEDIFF

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