范围内的日期

时间:2018-09-22 01:59:17

标签: sql sql-server tsql ssms

在我的场景中,我们有各种订单,这些订单以开始时间和结束时间完成。我试图仅在特定时间范围内获取记录,并以秒为单位计算持续时间。为了争辩,可以说24小时。我需要使用以下订单,并查看在该范围内调用哪些订单,并且仅计算落在24小时时间范围/日期范围内的每个订单之间的持续时间。每个订单的时间框架之外的任何内容都不会影响每个订单的持续时间。我的数据与下面非常相似。

Order #         Start                           End
Order 1         2018-09-20 11:00.00.000         2018-09-21 09:00.00.000
Order 2         2018-09-20 10:30.00.000         2018-09-21 08:00.00.000
Order 3         2018-09-20 10:21.00.000         2018-09-20 18:00.00.000
Order 4         2018-09-20 11:50.00.000         2018-09-21 10:00.00.000
Order 5         2018-09-20 19:00.00.000         2018-09-21 02:00.00.000

让我们说我正在尝试最后24小时,所以范围应该是

2018-09-20 11:00.00.000 to 2018-09-21 11:00.00.000

1 个答案:

答案 0 :(得分:4)

下图试图说明按日期/时间范围选择数据的逻辑:

Period Start "Ps"
Period End "Pe"

    Ps       Pe
s-E |        |        ignore, starts & ends before the period (E not > Ps)

 s--|--------|-E      spans the period
  s-|---E    |        start before, but ends in, the period
    s----E   |        starts at beginning of the period, finishes before the period ends
    | s---E  |        starts and finished within the period
    |   s----E        starts within the period, finishes on last day of the period
    |     s--|-E      starts within the period but finishes after the period

    |        | s-E    ignore, starts & ends after the period (s not < Pe)

     s < Pe
   + E >= Ps

使用该逻辑查询可能是:

DECLARE @Ps AS datetime = '2018-09-20 11:00.00.000'
DECLARE @Pe AS datetime = DATEADD(HOUR, 24, @Ps)

SELECT
    t.*
FROM yourtable AS t
WHERE t.[start] < @Pe
AND t.[end] >= @Ps

看起来与直觉相反,但是将订单开始时间与期间末进行比较,反之亦然,将订单结束时间与期间末进行比较。