SQL查询返回两个日期之间的行

时间:2012-05-21 07:05:56

标签: sql

我正在使用此查询获取两个日期之间的行但是我没有从数据库中获取行,它返回一个空集(在db中我有当天的行)

查询:

select email 
from users
where date_email_sent between '17-May-12' AND '17-May-12'

当我尝试下面的查询时,我只能获得第17行

查询:

select email
from users
where date_email_sent between '17-May-12' AND '18-May-12'

如果开始日期和结束日期相同,任何人都可以建议我如何单独获得第17条记录。

提前致谢。

5 个答案:

答案 0 :(得分:6)

date_email_sent是否有日期时间值?如果像2012-05-17 09:30:00.000这样的列值同时包含日期和时间,那么您可能需要将时间与日期值一起放在where子句中,

e.g。

where date_email_sent between '17-May-12 00:00:00.000' AND '17-May-12 23:59:59.000'

或者您只能查看字段的日期值

where DATEADD(dd, 0, DATEDIFF(dd, 0, date_email_sent )) between '17-May-12' AND '17-May-12'

如果只放置日期,SQL总是认为是上午12点,因此如果要将日期与日期时间值进行比较,则会出现问题

答案 1 :(得分:1)

在SQL Server中,你应该这样做。

select email 
from users
where date_email_sent >= '20120517' and 
      date_email_sent < dateadd(day, 1, '20120517')

如果您使用其他内容,则必须将dateadd替换为其他内容。

答案 2 :(得分:1)

当您指定没有时间部分的日期时,时间自动假定为12:00 am。所以当你写

date_email_sent between '17-May-12' AND '17-May-12'

这实际上与

相同
date_email_sent between '17-May-12 12:00AM' AND '17-May-12 12:00AM'

正如您所看到的,这两次是相同的,并且在指定的时间间隔内自然没有记录。

如果您想要在一天内完成所有记录,则需要从第二天的午夜到午夜进行测量:

date_email_sent >= '17-May-12 12:00AM' and date_email_sent < '18-May-12 12:00AM'

或只是:

date_email_sent >= '17-May-12' and date_email_sent < '18-May-12'

或者,您可以提取日期的日期部分并检查该值是否正确。具体的日期处理功能因dbms而异。

答案 3 :(得分:0)

select email 
from users
where date_email_sent >= '17-May-12' AND date_email_sent < '18-May-12'

答案 4 :(得分:0)

你写的时候  在'17-May-12'和'17-May-12'之间 所以你没有提到时间,所以在Date数据类型中它被认为是

'17-May-12 00:00:00'和'17-May-12 00:00:00'

因此您的范围有限,这就是您没有获得记录的原因。 你还应该提一下时间来获得同一日期的记录。 在oracle中你可以像这样写

BETWEEN to_date('dd-mm-yyyy hh24:mi','17-05-12 00:00') AND to_date('dd-mm-yyyy hh24:mi','17-05-12 23:59')