SQL 服务器日期转换 -"转换失败"



我在将日期从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');一样转换/投射它.无法更改字符串顺序,因为数据来自现有表。

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

如果无法修复根本问题(表使用错误的数据类型(,则需要应用正确的DATETIMEStyle,对于dd.MM.yyyy为 104:

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

如果可能的话,您应该更正原始表。你永远不应该使用VARCHAR存储日期,没有一个很好的理由这样做,也有很多很好的理由不这样做。如果您将数据类型更改为DATE,这将为您省去很多麻烦,然后您不必担心转换错误。你离开的时间越长,情况就会变得更糟。如果你不能改变表格,和你的DBA说几句话,告诉他们改变表格。如果你没有DBA,找一个可以的人。

下面有一些关于这方面的好文章:

  • 踢的坏习惯:选择错误的数据类型
  • 踢的坏习惯:处理日期/范围查询不当

补遗

如果由于其他进程使用而无法更改实际列,则仍然可以使用 check contraint 清理列,并可以选择包括计算列,以便始终可以访问真实日期,而不是 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",列"字符串日期"中。

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

CREATE NONCLUSTERED INDEX IX_DateTEst ON #DateTest (RealDate);

打开索引后,您可以利用正确存储日期的好处。

您的字符串格式错误。

应该是:

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

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

最新更新