为了让您的生活更轻松,真正的解决方案是停止将日期存储为字符串。假设您最初是从这张表开始的:
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
现在您的数据使用正确的数据类型存储,并且可以在没有所有这些混乱的字符串解释和数据类型转换的情况下进行比较。您的要求是:
对于以下情况,我需要将 Flag 标记为 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
我认为,这比继续将日期存储为字符串要好得多。