【问题标题】:SQL query between date/time with different fileds for date and times日期和时间的不同字段的日期时间之间的 SQL 查询
【发布时间】:2015-10-01 23:50:58
【问题描述】:

我有一个带有 2 个字段的 SQL Server 2014 数据库: - 记录日期为date 类型之一 - 记录时间为time 类型之一。

我想从表中检索 2 个日期/时间之间的记录。 示例:从 2015 年 1 月 1 日 16:00 到 2015 年 1 月 2 日 08:00。

我试过了

SELECT...
Date BETWEEN '2015-01-01' AND '2015-01-02'
AND Time BETWEEN '16:00' AND '08:00'

正如预期的那样,这失败了。

我可以做我想做的事吗?或者仅当我使用单个字段作为日期和时间(datetime 类型)?

【问题讨论】:

    标签: sql sql-server date datetime time


    【解决方案1】:

    尝试添加字段:

    WHERE cast(date as datetime)+cast(time as datetime) between
    '2015-01-01 16:00' AND '2015-01-02 8:00'
    

    【讨论】:

      【解决方案2】:

      只有在特定日期之间的特定时间窗口内查找记录时,您的查询才会起作用。例如。在 7 月 13 日至 17 日的办公时间内。

      WHERE [Date] BETWEEN '2015-07-13' AND '2015-07-17'
      AND CONVERT(Time, [Time]) BETWEEN '08:00' AND '16:00'
      

      而且由于您的开始 Time 值大于结束时间值,因此在将日期和时间合并为一个值之前,您不会得到任何结果,例如:

      WHERE CONVERT(DateTime, [Date]) + CONVERT(DateTime, [Time])
      BETWEEN '2015-01-01 16:00' AND '2015-01-02 08:00'
      

      【讨论】:

        【解决方案3】:

        您可以将这些字段连接起来,然后将它们转换在一起以形成datetime,如下所示:

        select *
        from thing
        where convert(datetime, convert(varchar(10), myDate) + ' ' + convert(varchar(10), myTIme)) between '2015-01-01 00:00:00' and '2015-01-02 01:01:00'
        

        请注意,我假设您的日期在 date 列中,而您的时间在 time 列中

        见小提琴:

        http://sqlfiddle.com/#!6/3a308/8

        如果您的大部分查询将在 datetime 而不是 datetime 上,请考虑添加一个 datetime 列,因为上述查询往往效率低下,因为需要对不必要的行运行转换以确定是否应包含它们。也许计算列也可以帮助解决这个问题。

        【讨论】:

        • 谢谢。您的解决方案效果很好。我会考虑您关于添加datetime 列的建议。我已经进行了一些测试,我可以从date 类型的一列加上time 类型的一列移动到datetime 的单列而不会丢失数据。
        猜你喜欢
        • 2016-07-09
        • 2015-04-16
        • 1970-01-01
        • 2016-07-10
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        • 1970-01-01
        • 2020-10-19
        相关资源
        最近更新 更多