我在将日期从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');
一样转换/投射它.无法更改字符串顺序,因为数据来自现有表。
我知道解决方案很简单,但我仍然缺少一些东西,还没有得到它:(
如果无法修复根本问题(表使用错误的数据类型(,则需要应用正确的DATETIME
Style,对于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