我想查询要获取的数据(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
答案 0 :(得分:1)
如果我没记错的话:
查询:
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