爲了讓您的生活更輕鬆,這裏真正的解決方案是stop storing dates as strings。比方說,你開始使用此表開始:
CREATE TABLE dbo.Nathan
(
ID INT,
ActualDt VARCHAR(32),
DueDt VARCHAR(32),
Flag CHAR(1)
);
GO
INSERT dbo.Nathan VALUES
(1,'01/03/12','09/13/12','Y'),
(2, NULL ,'07/12/12','Y'),
(3, NULL ,'09/12/12','N'),
(4,'02/03/12','01/13/12','N');
讓我們先來讓你的字符串完全明確:
UPDATE dbo.Nathan
SET ActualDt = CONVERT(CHAR(10), CONVERT(DATETIME, ActualDt, 1), 120),
DueDt = CONVERT(CHAR(10), CONVERT(DATETIME, DueDt , 1), 120);
現在讓我們來更正數據類型:
ALTER TABLE dbo.Nathan ALTER COLUMN ActualDt DATE;
ALTER TABLE dbo.Nathan ALTER COLUMN DueDt DATE;
-- you should also update any parameters or code where
-- explicit types are used to populate these columns
現在您的數據存儲使用正確的數據類型,並且比較可以在沒有所有這些混亂的字符串解釋和數據類型轉換的情況下工作。您的要求是:
我需要標註標誌爲Y以下條件:
1)如果ActualDt不是null DueDt不是null,DueDt> ActualDt
2)如果ActualDt爲null,並且DueDt基於過去由於當前日期
否則,標誌= N
對我來說,寫爲:
UPDATE dbo.Nathan
SET Flag = CASE WHEN DueDt > ActualDt
OR (ActualDt IS NULL AND DueDt < CURRENT_TIMESTAMP)
THEN 'Y' ELSE 'N' END;
結果:
ID ActualDt DueDt Flag
-- ---------- ---------- ----
1 2012-01-03 2012-09-13 Y -- DueDt > ActualDt
2 NULL 2012-07-12 Y -- past due
3 NULL 2012-09-12 N -- not past due
4 2012-02-03 2012-01-13 N -- DueDt NOT > ActualDt
這,我認爲,比繼續存儲日期字符串更好的方法。
是DueDt varchar還? – 2012-08-13 21:50:17
爲什麼你將日期存儲爲字符串?那含糊不清的字符串? – 2012-08-13 21:57:51