我想在列上寫上'No record',而不是NULL,如果 datediff 函式回傳一個空值。
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[/span
WHEN (dateiff(HOUR,c.timein,c.timeout) IS NULL)
THEN 'No record'END
), FROM tblCheckInOutDetail c RIGHT JOIN tblEmployee e one. IdEmployee = c.IdEmployee WHERE e.IdEmployee = 55
到目前為止,這段代碼只在'CAST'附近拋出了不正確的語法,預計是'AS'。但我不知道我應該在CAST引數中放入什么資料型別,因為如果有一條記錄,它將顯示日期時間。
uj5u.com熱心網友回復:
你需要將數字值轉換為字串。 為此,你可以使用coalesce():
SELECT concat(e.firstname ,e.lastname) as Fullname,c. shiftcode as Shift, cast(c.datecheckinoutas date) Date,datename(month, c.datecheckinout) as RecordMonth,c.timein , c.timeout,
COALESCE(CAST(datediff(HOUR, c.timein, c.timeout)) 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子句中被讀取的第一個表。
uj5u.com熱心網友回復:
嚴格地回答問題(盡管我不明白為什么你需要一個CASE運算式,如果你有作業版本的查詢),你可以很容易地把這個翻譯成CASE運算式:
ISNULL(CAST( datediff(HOUR,c. timein,c.timeout) as varchar),'No Record'/span>)
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(dateiff(HOUR,c. timein,c.timeout) as varchar(11)
ELSE 'No Record'/span> END
正如你所看到的,一個缺點是,如果你真的真的想要一個CASE運算式,你必須至少重復DATEDIFF,以涵蓋外部行不存在的情況和外部行存在但其中一個值是NULL的情況。
還要注意,你應該始終為變數型別(如varchar)指定一個長度,即使在你認為使用默認值很安全的情況下。
uj5u.com熱心網友回復:
我不知道這是否是正確的選項或用法。
但這對我來說是有效的:
ISNULL(CAST( datediff(HOUR,c. timein,c.timeout) as varchar),'No Record'/span>)
但是你們能告訴我如何使用case運算式來做這個嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/307259.html
標籤:
上一篇:通過在一個時間范圍內聚合一列來連接兩個表的SQL查詢
下一篇:驗證在SQL中添加一個相同的記錄
