【问题标题】:SQL query to return the rows between two datesSQL查询返回两个日期之间的行
【发布时间】:2012-05-21 07:05:56
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 你应该指定你正在使用的数据库
  • 查询似乎没问题。 date_email_sent 的数据类型是什么?
  • 您是在说 SQL(结构化查询语言),而您真的是指 Microsoft SQL Server(实际的数据库产品)吗?还是你用别的东西。

标签: sql


【解决方案1】:

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 总是认为是上午 12 点,所以如果你想将日期与日期时间值进行比较就会出现问题

【讨论】:

    【解决方案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 而异。

    【讨论】:

      【解决方案3】:

      在 SQL Server 中你应该这样做。

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

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

      【讨论】:

      【解决方案4】:
      select email 
      from users
      where date_email_sent >= '17-May-12' AND date_email_sent < '18-May-12'
      

      【讨论】:

        【解决方案5】:

        当你写作时 在“2012 年 5 月 17 日”和“2012 年 5 月 17 日”之间 所以你没有提到时间所以在 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')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-25
          • 1970-01-01
          • 2010-12-14
          • 2015-04-01
          • 2011-07-04
          • 1970-01-01
          • 2012-03-12
          • 2021-01-08
          相关资源
          最近更新 更多