我正在使用Microsoft SQL Server 2014 - 12.0.4100.1(X64)
我有一个填充了日期的字符串列。
问题是某些日期的格式为:Oct 17 2017 9:21AM
。我需要在列上强制执行此格式:2018-01-15 11:22:11.999
我做了一些研究,我知道我可以在创建表格时使用CHECK()设置约束,或者我知道我可以使用ISDATE(' 2014-05-01')但我没有端到端解决方案。
任何想法?任何建议都将不胜感激
编辑:
是一种传统解决方案。我知道这是一个糟糕的方法,但我无法改变该领域的格式!请解决问题的相关解决方案。
答案 0 :(得分:1)
如果你必须坚持这一点,你可以像这里一样添加一个计算列:
CREATE TABLE test(SomeSillyDate VARCHAR(100));
INSERT INTO test VALUES ('2018-01-15 11:22:11.99')
,('Oct 17 2017 9:2')
,('invalid date');
GO
ALTER TABLE test ADD CheckedDate AS TRY_CAST(SomeSillyDate AS DATETIME);
GO
SELECT * FROM test;
GO
DROP TABLE test;
但是 - 如果有机会 - 你应该将其存储为DATETIME
类型的值。
您可以在新表的顶部上使用VIEW
表名。这不会改变外界的方法......
CREATE TABLE test(ID INT IDENTITY, SomeSillyDate VARCHAR(100));
GO
CREATE TRIGGER TestTrigger ON test
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
WITH UpdCTE AS
(
SELECT t.SomeSillyDate AS oldValue
,ISNULL(FORMAT(TRY_CAST(i.SomeSillyDate AS DATETIME),'yyyy-MM-dd HH:mm:ss'),t.SomeSillyDate) AS newValue
FROM test AS t
INNER JOIN inserted AS i ON t.ID=i.ID
)
UPDATE UpdCTE
SET oldValue=newValue;
END
GO
INSERT INTO test VALUES ('2018-01-15 11:22:11.99')
,('Oct 17 2017 9:2')
,('invalid date');
GO
UPDATE test SET SomeSillyDate = GETDATE() WHERE ID=2;
GO
SELECT * FROM test;
GO
DROP TABLE test;