时间间隔查询

时间:2019-05-10 09:29:14

标签: sql

我想查询要获取的数据(PasssportNumber)在特定时间间隔内有BoarderCrossing。我在这里找到了几乎正确的答案,但是当间隔的第一次大于第二次时,并没有为我提供解决方案。

BorderCrossingID  PassportNumber    BorderCrossingDateTime
1                    ER-2222        2019-01-07 22:11:12.000
2                    ER-2222        2019-01-07 23:11:12.000
3                    KL-5233        2018-10-03 17:10:39.000
130                  FF-4444        2019-01-08 11:11:11.000
5                    ER-1111         NULL
6                    KL-5686         NULL
7                    ER-1111         NULL
8                    KL-5235         NULL
9                    QW-5656         NULL
160                  NN-4444       2019-01-30 12:51:19.000
161                  JJ-8911       2019-02-25 14:26:08.000
163                  FG-7878       2019-02-28 11:00:53.113
165                  NN-4444       2018-02-28 12:51:19.000
166                  GG-4545       2019-02-28 13:38:08.233
167                  FF-9876       2019-02-28 14:12:26.000
168                  FG-4587       2019-03-12 15:56:45.303
169                  ZZ-2332       2019-03-13 09:18:11.543
170                  FR-0120       2019-03-14 14:40:32.313
171                  FG-0120       2019-03-14 14:41:07.703
172                  FF-0012       2019-03-14 05:43:16.623
173                  FF-0012       2019-03-14 14:43:26.833
178                  TU-0140       2019-03-18 00:15:10.000
179                  IU-0140       2019-03-18 23:15:10.000

当第一次是较小的代码时,下面的代码可以正常工作。如果将OR更改为AND,则查询工作在反向模式下(第一次可能更大,但第二次更大时结果将为假)

SELECT PassportName
       FROM Passports
       EXCEPT
       SELECT BorderCrossingDateTime
       FROM Passports
       WHERE BorderCrossingDateTime IS NULL OR CONVERT(TIME, BorderCrossingDateTime) < '23:00' OR CONVERT(TIME, BorderCrossingDateTime) > '23:59'

我希望有一个可以在任何可能的情况下工作的解决方案。 在c#中,我使用TimeSpan来避免此问题。

结果应该在下面使用我要实现的查询

    SELECT PassportName
           FROM Passports
           EXCEPT
           SELECT BorderCrossingDateTime
           FROM Passports
           WHERE BorderCrossingDateTime IS NULL OR CONVERT(TIME, BorderCrossingDateTime) < '23:00' OR CONVERT(TIME, BorderCrossingDateTime) > '01:00'

PassportNumber
ER-2222
TU-0140
IU-0140



2 个答案:

答案 0 :(得分:1)

如果我没记错的话:

  • 在10:00和20:00之间表示> = 10:00 <20:00
  • 在20:00和10:00之间表示> = 20:00 <10:00

查询:

select passportname
from (select passports.*, convert(time, bordercrossingdatetime) as tm from passports) p
where (@start < @end and tm >= @start and tm < @end)
   or (@start > @end and (tm >= @start or tm < @end));

答案 1 :(得分:0)

请尝试这个-

SELECT PassportNumber
FROM Passports
WHERE CONVERT(TIME, BorderCrossingDateTime) > '23:00' 
OR CONVERT(TIME, BorderCrossingDateTime) < '01:00'

输出-

ER-2222
TU-0140
IU-0140