【发布时间】:2016-12-09 01:17:21
【问题描述】:
WITH Valid_dates (ValidDate)
AS
(
SELECT '19' + SUBSTRING(column, 0, 3) + '-' + SUBSTRING(column, 3, 2) + '-' + SUBSTRING(column, 5, 2) AS ValidDate
FROM table
WHERE SUBSTRING(column, 3, 2) <= '12' --Max month
AND SUBSTRING(column, 3, 2) >= '01' --Min month
AND ISNULL(SUBSTRING(column, 3, 2), '') <> '' --Empty string
AND SUBSTRING(column, 5, 2) <= '31' --Max day
AND SUBSTRING(column, 5, 2) >= '01' --Min month
AND ISNULL(SUBSTRING(column, 5, 2), '') <> '' --Empty string
AND LEN('19' + SUBSTRING(column, 0, 3) + '-' + SUBSTRING(column, 3, 2) + '-' + SUBSTRING(column, 5, 2)) = 10 --Must match 10 character format
)
SELECT CONVERT(DATETIME, ValidDate)
FROM Valid_dates
当我在 SQL Server Management Studio 中执行此查询时,我收到以下错误消息:“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。”
我已过滤掉所有无效日期。如您所见,2 月 30 日、4 月 31 日、6 月 31 日等不存在的日期本身并没有被过滤掉,但我已经检查了它们,它们不存在。仅运行 CTE 查询会产生大量结果,但我找不到任何差异。
【问题讨论】:
-
它对任何小数据子集是否有效或失败,例如,只需在一些单条记录上尝试您的 SQL - 如果它总是失败,则说明您输入错误的数据,如果有时失败,那么您可能有一些例如 29/02/1900 之类的无效日期
-
如果您通过 validdtae 执行 SELECT TOP 1 CONVERT(DATETIME, ValidDate) 订单,如果失败,请尝试通过 validdtae 执行 SELECT TOP 1 ValidDate 订单 - 会发生什么?
-
table 中column 的输入(实际内容)是什么?
标签: sql sql-server datetime type-conversion