SQL Server日期转换-“转换失败”

时间:2019-12-06 12:14:55

标签: sql-server date datetime casting type-conversion

我无法将日期从varchar转换为date格式:

Msg 241, Level 16, State 1, Line 15 Conversion failed when converting date and/or time from character string.

我正在尝试像SELECT convert(DATE, '25.02.2019');那样进行转换/广播。无法更改字符串顺序,因为数据来自现有表。

我知道解决方案很简单,但是我仍然缺少一些东西,但还没有得到:(

2 个答案:

答案 0 :(得分:1)

如果您无法解决根本的问题(表使用了错误的数据类型),则需要应用正确的DATETIME Style,对于dd.MM.yyyy而言,它是104:

SELECT CONVERT(DATE, '25.02.2019', 104);

尽管有可能,但您应该更正原始表格。您不应该使用VARCHAR 从不存储日期,这样做的理由不充分,有很多理由不建议这样做。如果将数据类型更改为DATE,这将为您省去很多麻烦,然后您就不必担心转换错误。您留下的时间越长,效果就会越差。如果您不能更改表,请与您的DBA谈一谈,并告诉他们更改表。如果您没有DBA,请找一个可以的人。

下面有一些很好的文章:


添加

如果由于其他进程使用它而无法更改实际的列,则仍然可以使用检查约束对列进行清理,并可以选择包括计算列,以便您始终可以访问实际日期,而不必varchar:

例如

IF OBJECT_ID(N'tempdb..#DateTest', 'U') IS NOT NULL
    DROP TABLE #DateTest;

CREATE TABLE #DateTest 
(
        StringDate CHAR(10) NOT NULL,
        RealDate AS CONVERT(DATE, StringDate, 104),
    CONSTRAINT CHK_DateTest__RealDate CHECK (TRY_CONVERT(DATE, StringDate, 104) IS NOT NULL)
);

这将允许您继续添加/编辑varchar日期:

-- insert valid date and check output
INSERT #DateTest (StringDate) VALUES ('25.02.2019');

SELECT RealDate
FROM #DateTest;

检查约束将阻止您添加非日期的任何日期:

--Try to insert invalid date
INSERT #DateTest (StringDate) VALUES ('29.02.2019');

这将引发错误:

  

INSERT语句与CHECK约束“ CHK_DateTest__RealDate”冲突。在数据库“ tempdb”的表“ dbo。#DateTest ___________________________________________________________________________________________________________ 000000000704”的“ StringDate”列中发生了冲突。

您甚至可以为该列编制索引:

CREATE NONCLUSTERED INDEX IX_DateTEst ON #DateTest (RealDate);

启用索引后,您可以利用正确存储日期所带来的好处。

答案 1 :(得分:0)

您的字符串格式错误。

应该是:

SELECT convert(DATE, '2019-05-02')

编辑:如果无法获得该格式的日期,则将104作为第三个参数。 这是可选格式参数的列表。 https://www.w3schools.com/SQL/func_sqlserver_convert.asp