【问题标题】:Conversion failed when converting date and/or time from character string. T-Sql从字符串转换日期和/或时间时转换失败。 T-Sql
【发布时间】:2021-07-13 11:41:31
【问题描述】:

我的数据库中有一个名为 ref003 的 varchar 列,它存储如下所示的日期时间

2021-04-04 20:01:03

这里,日期格式类似于yyyy-MM-DD

当我执行以下选择查询时出现错误

SELECT *
FROM FileIndex
WHERE CAST(CONVERT(CHAR(30), CONVERT(DATETIME, Ref003, 105), 101) AS DATE) 
    BETWEEN CAST(CONVERT(CHAR(10), CONVERT(DATETIME, '01-01-2021', 105), 101) AS DATE) 
    AND CAST(CONVERT(CHAR(10), CONVERT(DATETIME, '31-12-2021', 105), 101) AS DATE)

错误是

Msg 241, Level 16, State 1, Line 5 转换时转换失败 字符串中的日期和/或时间。

这里有什么问题,我该如何解决这个问题?

【问题讨论】:

  • “我的数据库中有一个名为 ref003 的 varchar 列,它存储如下所示的日期时间” 真正的问题是为什么要存储日期和时间值首先是varchar?修复设计,修复问题。
  • 因为这是一个动态列,可以存储任何内容,但对于当前场景,它始终存储 varchar
  • 至于错误,我不怀疑这是因为您有至少一行Ref003 的值无法转换。虽然快速阅读 Date and Time Styles 会告诉您样式 105 不适用于值 '2021-04-04 20:01:03'
  • “因为这是一个动态列,它可以存储任何内容,但对于当前场景,它始终存储 varchar” 那么你就有更大的设计缺陷。 EAV 表在 RDBMS 中从来都不是一个好主意。由于此缺陷,CONVERT(DATETIME, Ref003, 105) 正在 可能会尝试转换表中Ref003每个 值;包括那些不是“日期时间”的。这只会加强我的说法:修复设计,修复问题。
  • 如果您想存储任意字段,您可以使用稀疏列、XML 或 JSON 字段。假设您确实需要任意字段。通常,这样的设计是“以防万一”

标签: tsql datetime converters


【解决方案1】:

首先,对于转换,您需要转换为VARCHAR,而不是DATE。注意这个表达式:

CONVERT(VARCHAR(10), CAST(<your date value> AS DATE), 20)

考虑到这一点,您可以像这样清理查询:

--==== Easily consumable sample data
DECLARE @thetable TABLE (someid INT, thedate DATETIME);
INSERT @thetable
VALUES(1,'2021-04-04 20:01:03'),(2,'2021-06-04 22:01:05'),(1,'2021-04-29 10:31:11');

--==== Solution
SELECT      t.*, FormattedDate = fmt.Dt 
FROM        @thetable                                               AS t
CROSS APPLY (VALUES(CONVERT(VARCHAR(10), CAST(t.thedate AS DATE), 20))) AS fmt(Dt)
WHERE       t.thedate BETWEEN '20210401' AND '20210501';

返回:

someid      thedate                 FormattedDate
----------- ----------------------- -------------
1           2021-04-04 20:01:03.000 2021-04-04
1           2021-04-29 10:31:11.000 2021-04-29

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多