Я уверен, что этот запрос написан правильно, но я продолжаю вставлять "Null" в ожидаемый столбец. Мои столбцы даты начала и окончания имеют дату и время и содержат дату, поэтому я не уверен, почему он не выполняет вычисление даты и обновляет столбец.

Я делаю что-то не так, что легко упускается из виду?

DECLARE @X INT

UPDATE MyTable
SET @X = DATEDIFF(s, Start_Date, End_Date)
    ,Column1 = CASE 
        WHEN Start_Date <> NULL
            AND End_Date <> NULL
            THEN (
                    SELECT CONVERT(VARCHAR(10), (@x / 86400)) + ' Days ' + CONVERT(VARCHAR(10), ((@x % 86400) / 3600)) + ' Hours ' + CONVERT(VARCHAR(10), (((@x % 86400) % 3600) / 60)) + ' Minutes '
                    )
        ELSE NULL
        END

Пример данных: дата начала = 2018-08-08 00: 00: 00.000 дата окончания = 2020-08-08 00: 00: 00.000

(Это фактические данные, которые я использую в моей реальной БД)

0
Classified Mystery 27 Апр 2019 в 00:59

2 ответа

Лучший ответ

Вы должны удалить оператор выбора внутри case:

DECLARE @X INT

UPDATE MyTable
SET @X = DATEDIFF(s, Start_Date, End_Date)
    ,Column1 = CASE 
        WHEN Start_Date is not NULL AND End_Date is not NULL
            THEN    CONVERT(VARCHAR(10), (@x / 86400)) + ' Days ' + 
                    CONVERT(VARCHAR(10), ((@x % 86400) / 3600)) + ' Hours ' + 
                    CONVERT(VARCHAR(10), (((@x % 86400) % 3600) / 60)) + ' Minutes '
        ELSE NULL
    END

Кажется, что подзапрос

(SELECT CONVERT....) 

Оценивается раньше

@X = DATEDIFF(s, Start_Date, End_Date)

Поэтому @X по-прежнему null, а результат подзапроса - null.

0
forpas 26 Апр 2019 в 22:53

Да. См. Не равно <>! = Оператор для NULL

<> это стандартный SQL-92; ! = это его эквивалент. Оба оценивают значения, которые не равны NULL - NULL является заполнителем, указывающим на отсутствие значения.

Вот почему вы можете использовать только IS NULL / IS NOT NULL в качестве предикатов для таких ситуаций.

0
donPablo 26 Апр 2019 в 22:08