【发布时间】: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