鉴于日期,2009/04/30,我希望在其中一行中检索所有日期< = 2009/04/30和> = 2009/04/30。 sql语句是这样的:
select dateColumn from someTable where dateColumn <= '2009/4/30'
select dateColumn from someTable where dateColumn >= '2009/4/30'
以上2个语句运行但第一个语句返回2009/04/30以下的所有日期,它似乎排除日期,即使它出现在数据库中。知道为什么会这样吗?我如何比较sql中的DateTime对象的日期部分?
答案 0 :(得分:5)
SQL Server
存储日期和时间。
select dateColumn from someTable where dateColumn <= '2009/4/30'
返回小于或等于2009/4/30 00:00:00
的所有日期。
如果您的约会日期至少1/300
秒,e。 G。 2009/4/30 00:00:00.003
,它不会被退回。
您需要选择以下内容:
select dateColumn from someTable where dateColumn < '2009/5/01'
或者像这样:
select dateColumn from someTable where dateColumn < DATEADD(day, 1, '2009/4/30')
答案 1 :(得分:1)
该列是否包含时间数据?如上所述,第一个查询将返回dateColumn在凌晨12:00(午夜)小于或等于2009/4/30的记录。您可以使用CAST或CONVERT仅比较时间部分,但在这种情况下,最简单的答案是将第一个查询更改为:
select dateColumn from someTable where dateColumn < '2009/5/1'
答案 2 :(得分:1)
第一个查询隐式将您的日期字符串转换为datetime
。这种转换产生:
2009-04-30 00:00:00.000
排除日期是否可能在当天但是在以后被上述值排除的时间?
答案 3 :(得分:1)
选择dateColumn 来自someTable dateadd(dd,-1,'2009/4/30')和dateadd(dd,1,'2009/4/30')之间的dateColumn
此查询将选择在您指定的两个日期之间具有dateColumn值的列,包括它们。希望它能解决您的问题。
答案 4 :(得分:0)
不要将日期与字符串进行比较。
http://rtipton.wordpress.com/2009/01/18/converting-dates-in-sql-server/
至于获取日期部分,日期在内部表示为浮点数,其中1是一天。
CONVERT(DATETIME, CONVERT(INT, GETDATE()))
将执行您想要的日期时间到期转换。
答案 5 :(得分:0)
如果您将日期指定为字符串而未指定时间,则使用该日期的午夜(12:00 AM)。如果您想要在给定日期(而不是午夜)中包含所有时间,请使用小于后续日期的比较 - 这比使用晚上11:59:59更容易,更准确。
select dateColumn from someTable where dateColumn < '2009/5/1'
或者您可以将日期转换为排除时间,但您需要小心将比较命名为yyyymmdd
以使订单正确无误。将字符串转换为日期也会起作用,但您仍需要确保比较第二天的午夜而不是相关日期的午夜。
select dateColumn from someTable where CONVERT(varchar,dateColumn,112) <= '2090430'
答案 6 :(得分:0)
在MySQL documentation page中,您可以使用一个非常有用的辅助函数列表。您在查询中所做的是比较字符串而不是日期。如果您将月份写为两位数而不是4,那么它可能会有效。无论如何,最好转换为UNIX_TIMESTAMP并根据它进行比较。
答案 7 :(得分:0)
无论创建数据是什么,都包括凌晨12:00以外的时间。
我发现了这个:杰夫的SQL Server博客并使用它来摆脱时间我想要的只是日期:
dateadd(dd,0, datediff(dd,0,@DateTime))
所以你的查询可能是:
select dateColumn from someTable where dateadd(dd,0, datediff(dd,0, [dateColumn]))<= '2009/4/30'
我把它变成了一个功能,因为它被大量使用了。