SQL在列上强制执行字符串格式

时间:2018-02-16 10:05:30

标签: sql sql-server tsql sql-server-2014 datetime-format

我正在使用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')但我没有端到端解决方案。

  • 我可以清理当前数据,因此这个约束只适用于将来的插入。
  • 我正在寻找一个简单的解决方案。
  

任何想法?任何建议都将不胜感激

编辑:

是一种传统解决方案。我知道这是一个糟糕的方法,但我无法改变该领域的格式!请解决问题的相关解决方案。

1 个答案:

答案 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;