我有这么简单的问题,我觉得这很愚蠢。我简直不敢相信自己会对此感到震惊。
我有一张名为“订单”的表格。 “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)
我做错了什么?我不敢相信我甚至都在问这个问题。
答案 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