有一個SELECT在有一些嵌套的存盤程序case-when塊,而這個東西來了有關在不同的5倍or塊:
CONVERT(DATE, ADJDOH) <= CONVERT(DATE, ADJDOT)
這些欄位可以有DATETIME, 為空(空字串)或NULL, 或無效值,這會使CONVERT函式失敗。有什么方法可以將這些欄位轉換一次,然后進行比較,或者比CONVERT多次使用該函式更容易進行空檢查?
在下面的示例中,如果日期無效,第 4 行會給出錯誤。
CREATE TABLE repro (
id int,
date1 varchar(10),
date2 varchar(10)
)
INSERT INTO repro values
(1, '12/31/2021', '12/30/2021'),
(2, NULL, '12/14/2021'),
(3, '',''),
(4, '12/30/202', '12/30/2021')
SELECT
CONVERT(DATE,date1) as D1,
CONVERT(DATE,date2) as D2
from repro
where
--id = 1
--id = 2
--id = 3
id = 4
drop table repro
uj5u.com熱心網友回復:
CROSS APPLY TRY_CONVERT是你想要的。CROSS APPLY允許您在一個地方執行任何計算/轉換/等,而無需復制邏輯。TRY_CONVERT允許您檢測和/或從壞資料中恢復。
SELECT
D.Date1 AS D1
, D.Date2 AS D2
FROM repro
CROSS APPLY (
-- Perform any calculations/conversions here, once
VALUES (TRY_CONVERT(DATE,date1), TRY_CONVERT(DATE,date2))
) AS D (Date1, Date2);
uj5u.com熱心網友回復:
你可以
添加一個_computed 列
在提供所需列的表上定義視圖
不過,您仍然需要以某種方式處理壞資料。但是這些都為您提供了一種提供日期轉換的持久方式,而無需一遍又一遍地重復邏輯。
[坦率地說,我會清理表中的資料,然后check對列施加約束以確保錯誤日期無法進行任何插入或更新。或者,更好的是,將列轉換為date并完成它——盡管這可能會破壞期望列為char/ 的現有代碼varchar。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/371561.html
標籤:sql sql-server 查询语句 sql函数
上一篇:從字串中獲取最后一組數字
