Поднять флаг, если дата превышает 1 день / 24 часа

Я пытаюсь создать столбец, который поднимает флаг, когда продолжительность составляет день (24 часа или более) с даты начальной даты.

select 
    case when (enddte - begindte) > '23:59:59.000'  
        then '1' 
        else '0' 
    end as flag 
from shipment 
where ship_id = '14723'

Обратите внимание: даты для enddte и begindte имеют следующий формат, например: 2017-09-06 20:22:36.000

Нужно ли мне дополнительно разбивать оператор case выше, вычисляя день-день и часы-часы?


person VQB    schedule 06.11.2020    source источник
comment
Пожалуйста, укажите в своем вопросе базу данных, с которой вы работаете: mysql, oracle, postgresql...? Кроме того, каковы типы данных столбцов begindte и enddte?   -  person GMB    schedule 06.11.2020
comment
@GMB: похоже, что OP использует MSSQL. Я обновил теги соответственно. ТАКЖЕ: я не уверен, как OP вызывает этот запрос, но я не уверен, что выбрать случай, когда это лучший подход...   -  person paulsm4    schedule 06.11.2020
comment
@GMB, да, я использую MSSQL. Тип данных — дата-время. Я думал, что запрос должен выглядеть примерно так, но еще не заставил его работать. выберите случай, когда (dateiff(hour,enddte, begindte)/24.0) › 1, затем '1', иначе '0' заканчивается флагом отгрузки, где ship_id = '14723'   -  person VQB    schedule 06.11.2020


Ответы (2)


datediff() не лучший инструмент для этой задачи. Он увеличивается на 1 каждый раз, когда пересекается граница, что приводит к каким-то нелогичным результатам. Обычно разница в часе между сегодняшним 13:59 и сегодняшним 14:01 составляет 1.

Вы можете использовать простую арифметику даты, как показано ниже:

select s.*,
    case when enddte > dateadd(day, 1, begindte) then 1 else 0 end as flag
from shipment s
where ship_id = 14723

Конечно, это предполагает, что два столбца имеют допустимый тип данных, похожий на дату, например datetime или datetime2.

person GMB    schedule 06.11.2020

Я верю, я разобрался.

select 
    case 
        when (datediff(hour,enddte, begindte)/24.0) > 1 
            then '1' 
            else '0' 
        end as flag 
from shipment 
where ship_id = '1326747-2'
person VQB    schedule 06.11.2020