使用Sql检索DateTime对象的问题

时间:2009-05-04 11:39:02

标签: sql sql-server

鉴于日期,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对象的日期部分?

8 个答案:

答案 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'

我把它变成了一个功能,因为它被大量使用了。