ここでの本当の解決策は、あなたの生活を楽にするために、日付を文字列として保存するのをやめることです。最初にこのテーブルから始めたとしましょう。
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が期限を過ぎている
場合それ以外の
場合、Flag = 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
これは、日付を文字列として保存し続けるよりもはるかに優れたアプローチだと思います。