2009-05-04 39 views
0

给定日期2009/04/30,在其中一行中,我想检索所有日期< = 2009/04/30和> = 2009/04/30。 SQL语句是这样的:使用Sql检索DateTime对象的问题

select dateColumn from someTable where dateColumn <= '2009/4/30' 

select dateColumn from someTable where dateColumn >= '2009/4/30' 

以上2个语句运行,但第一个语句返回下面2009/04/30所有日期,它似乎被排除,即使它出现在DB的日期。任何想法为什么这可能会发生?我如何比较SQL中日期时间对象的日期部分?

回答

5

SQL Server随时间存储日期。

select dateColumn from someTable where dateColumn <= '2009/4/30' 

返回所有日期小于或等于2009/4/30 00:00:00

如果你的日期至少比1/300秒大, 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

该列是否包含时间数据?正如所写的,第一个查询将返回dateColumn小于或等于2009年4月30日凌晨12:00(午夜)的记录。您可以使用CAST或转换为只比较时的部分,但在这种情况下,最简单的答案是第一个查询更改为:当指定的日期为字符串,不指定时间

select dateColumn from someTable where dateColumn < '2009/5/1' 
0

,它使用该日期的午夜(中午12:00)。如果您希望包含给定日期(而不是午夜)的所有时间,请使用小于后续日期的比较 - 这比使用11:59:59 PM更容易且更准确。

select dateColumn from someTable where dateColumn < '2009/5/1' 

或者你可以投的日期排除时间,但你必须要小心,为了你的比较,因为yyyymmdd,以获得正确的排序。将字符串转换为日期也可以,但仍然需要确保在比较日期中的第二天的午夜而不是午夜的时间进行比较。

select dateColumn from someTable where CONVERT(varchar,dateColumn,112) <= '2090430' 
1

第一个查询是隐式地将您的日期字符串转换为datetime。这种转换率:

2009-04-30 00:00:00.000 

是否有可能被排除的日期是在那一天又在将由上述的值被排除稍后的时间?

0

在MySQL documentation page中有一个非常有用的助手函数列表,您可以使用它。你在查询中所做的是比较字符串不是日期。如果您将月份编写为两位数字04而不是4,那么它可能会有效。无论如何,您最好转换为UNIX_TIMESTAMP并根据它进行比较。

+0

这是否在SQL Server中工作? – JeffO 2009-05-04 12:45:27

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' 

我使它成为一个函数,因为它被使用了很多。

1

选择dateColumn 从someTable 其中dateColumn DATEADD(DD,-1, '2009/4/30')和DATEADD(DD,1, '2009/4/30')

这之间查询将选择您指定的两个日期之间包含dateColumn值的列。希望它能解决您的问题。