SQL между временем не показывает результаты - PullRequest
0 голосов
/ 11 ноября 2019

Можно использовать свежую справку POV :)

Нужно показывать поездки с полуночи до 4 утра. StartTime столбец имеет тип DATETIME. Я уже пробовал

CAST(StartTime AS TIME) BETWEEN CAST('00:00:00' AS TIME) AND....

, но он не показал правильных результатов, и поэтому я сделал это IIF, но все же, хотя StartTime НЕ между полночью и 4 утра, результаты показывают 1. Я что-то пропустил? Спасибо за помощь!

SELECT 
    id
,   StartTime
,   DATEADD(d, 0, DATEDIFF(d, 0, StartTime)) AS Midnight
,   DATEADD(hh, +4 , DATEDIFF(d, 0, StartTime)) AS FourAM
,   IIF((StartTime BETWEEN DATEADD(d, 0, DATEDIFF(d, 0, StartTime))
                      AND DATEADD(hh, +4 , DATEDIFF(d, 0, StartTime))), 1, 0) _Between_Check
FROM 
    FUN.Trip

Результаты:

ID          | StartDate             | Midnight                | FourAM                  | Between_Check
------------+-----------------------+-------------------------+-------------------------+--------------
-2135024021 | 19-10-02 00:04:01.000 | 2019-10-02 00:00:00.000 | 2019-10-02 00:04:00.000 | 1
-2135024228 | 19-10-05 00:04:30.000 | 2019-10-05 00:00:00.000 | 2019-10-05 00:04:00.000 | 1

Выше приведен результат, который я получаю. Столбец Between_Check должен показывать 0, так как StartDate - это минута после 4 AM * 10101

Вот что я должен получить

Результаты:

ID          | StartDate             | Midnight                | FourAM                  | Between_Check
------------+-----------------------+-------------------------+-------------------------+--------------
-2135024021 | 19-10-02 00:04:01.000 | 2019-10-02 00:00:00.000 | 2019-10-02 00:04:00.000 | 0
-2135024228 | 19-10-05 00:02:30.000 | 2019-10-05 00:00:00.000 | 2019-10-05 00:04:00.000 | 0

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Ответ содержится в комментарии HABO, который заставил меня взглянуть на набор результатов.

0 голосов
/ 11 ноября 2019

, если вы хотите проверить, находится ли время между полуночью и 4:00, почему бы просто не использовать datepart(hour, {datetime})

IIF (DATEPART(HOUR, StartTime) BETWEEN 0 AND 4, 1, 0)

или, альтернативно, CONVERT() тип данных StartTime до timeи затем сравните со строкой времени

IIF (CONVERT(TIME, StartTime) BETWEEN '00:00' AND '04:00', 1, 0)

или

IIF (CONVERT(TIME, StartTime) >= '00:00' AND CONVERT(TIME, StartTime) < '04:00', 1, 0)

Не уверен, что вы хотите, чтобы время 04:00 было включающим или нет. В любом случае выше приведены различные варианты, которые вы можете использовать

то, что вы здесь делаете, всегда будет истинным

IIF(
        (StartTime BETWEEN 
                                DATEADD(d, 0, StartTime) 
                            AND DATEADD(hh, +4, StartTime))
        , 1, 0) 

, потому что DATEADD(d, 0, StartTime) в основном не имеет никакого эффекта и равно StartTime

...