我无法将日期从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');
那样进行转换/广播。无法更改字符串顺序,因为数据来自现有表。
我知道解决方案很简单,但是我仍然缺少一些东西,但还没有得到:(
答案 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