Я хотел поставить в столбце «Нет записи» вместо NULL , если функция dateiff возвращает нулевое значение.

SELECT concat(e.firstname ,e.lastname) as Fullname,c.shiftcode as Shift, cast(c.datecheckinout as date) Date,datename(month, c.datecheckinout) as RecordMonth,c.timein , c.timeout,
CAST( 
    CASE
    WHEN (datediff(HOUR,c.timein,c.timeout)  IS NULL) 
    THEN 'No record'
    END 
    ), FROM tblCheckInOutDetail c  RIGHT JOIN tblEmployee e on e.IdEmployee = c.IdEmployee   WHERE e.IdEmployee = 55



Пока этот код выдает только неправильный синтаксис рядом с «CAST», ожидаемый «AS». но я не знаю, какой тип данных следует указать в параметре CAST, поскольку, если есть запись, она покажет дату и время.

0
John Phillip Abello 15 Сен 2021 в 15:03

3 ответа

Лучший ответ

Строго отвечая на вопрос (правда, я не понимаю, зачем вам CASE expression, если у вас есть рабочие версии запроса), вы можете легко преобразовать это в выражение CASE:

ISNULL(CAST(datediff(HOUR,c.timein,c.timeout) as varchar),'No Record')

ISNULL действительно хорошее, удобное сокращение для CASE WHEN a IS NOT NULL THEN a ELSE b END, так что:

CASE WHEN DATEDIFF(HOUR, c.timein, c.timeout) IS NOT NULL
  THEN CAST(datediff(HOUR,c.timein,c.timeout) as varchar(11))
  ELSE 'No Record' END

Как видите, оборотной стороной является то, что если вам действительно действительно нужно выражение CASE, вам нужно повторить хотя бы DATEDIFF, чтобы охватить как случай, когда внешняя строка не существует, так и случай, когда внешняя строка существует, но одно из значений - NULL.

Также обратите внимание, что вам следует всегда указывать length для таких типов переменных, как varchar, даже в тех случаях, когда вы думаете, что можете безопасно использовать значение по умолчанию.

0
Aaron Bertrand 15 Сен 2021 в 12:27

Вам нужно преобразовать числовое значение в строку. Для этого вы можете использовать coalesce():

SELECT concat(e.firstname ,e.lastname) as Fullname,c.shiftcode as Shift, cast(c.datecheckinout as date) Date,datename(month, c.datecheckinout) as RecordMonth,c.timein , c.timeout,
       COALESCE(CAST(datediff(HOUR, c.timein, c.timeout) AS VARCHAR(255)), 'No record')
FROM tblEmployee e LEFT JOIN
     tblCheckInOutDetail c 
     ON e.IdEmployee = c.IdEmployee
WHERE e.IdEmployee = 55;

Примечание: я переключил RIGHT JOIN на LEFT JOIN. Логически они эквивалентны. Но большинству людей гораздо проще следовать логике LEFT JOIN, потому что таблица, которая определяет строки, является первой таблицей, читаемой в предложении FROM.

2
Gordon Linoff 15 Сен 2021 в 12:05

Я не знаю, правильный ли это вариант или использование.

Но это работает для меня:

ISNULL(CAST(datediff(HOUR,c.timein,c.timeout) as varchar),'No Record')

Но можете ли вы, ребята, показать мне, как это сделать с помощью case-выражения?

0
John Phillip Abello 15 Сен 2021 в 12:46