2

我正在使用此查询来获取两个日期之间的行,但我没有从数据库中获取行,它返回一个空集(在 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 条记录。

提前致谢。

4

5 回答 5

6

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

例如

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 总是将其视为 12am,因此如果您想将日期与日期时间值进行比较,则会出现问题

于 2012-05-21T07:13:30.720 回答
2

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

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。

于 2012-05-21T07:15:35.007 回答
1

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

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

如果您使用其他东西,则必须用其他dateadd东西替换。

于 2012-05-21T07:12:30.593 回答
0

当你写 BETWEEN '17-May-12' AND '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')
于 2012-05-21T07:17:01.933 回答
0
select email 
from users
where date_email_sent >= '17-May-12' AND date_email_sent < '18-May-12'
于 2012-05-21T07:11:17.907 回答