FROM_DATE
列是temptable1stockdetails
表中的DATETIME
格式。
Gradd19
列是GradedDETAILS
表中的VARCHAR
格式。
我想将Gradd19
值插入到FROM_DATE
,但它引发以下错误:
将varchar数据类型转换为日期时间数据类型会导致超出范围的值。语句已被终止
我该如何解决这个问题。
Gradd19
表中的GradedDETAILS
示例数据如下:
Sep 16 2016 12:00AM
Sep 16 2016 12:00AM
Sep 16 2016 12:00AM
Sep 19 2016 12:00AM
Sep 19 2016 12:00AM
Sep 16 2016 12:00AM
20
60
20-09-2016
20-09-2016
发布于 2016-09-27 06:44:50
由于您没有共享Gradd19
值的示例数据,所以我怀疑日期值是yyyy-dd-mm
格式的,所以当尝试转换(月份值超过12)时,会导致超出范围的值错误。
对于示例,如果yyyy-mm-dd
中的日期格式,它将正确执行:
DECLARE @FromDate DATETIME;
DECLARE @Gradd19 AS VARCHAR (20) = '2016-11-15';
SELECT @FromDate = CONVERT(VARCHAR, @Gradd19, 105);
SELECT @FromDate;
如果是在yyyy-dd-mm
中,则会抛出超出范围的值错误。
DECLARE @FromDate1 DATETIME;
DECLARE @Gradd191 AS VARCHAR (20) = '2016-15-11';
SELECT @FromDate1 = CONVERT(VARCHAR, @Gradd191, 105);
SELECT @FromDate1;
因此,在这种情况下,您需要再进行一次转换,以跳过问题,如下所示:
DECLARE @FromDate2 DATETIME;
DECLARE @Gradd192 AS VARCHAR (20) = '2016-15-11';
SELECT @FromDate2 = CONVERT(VARCHAR(19), CONVERT(DATETIME, @Gradd192, 105), 120)
SELECT @FromDate2;
所以而不是
CONVERT(VARCHAR, Gradd19, 105) AS ExpiryDate
你需要用
CONVERT(VARCHAR(19), CONVERT(DATETIME, Gradd19, 105), 120) AS ExpiryDate
更新:正如您在注释中提到的,Gradd19
的值为20
和60
,很难过滤那些无效的数据。但是,基于LEN()
函数,您可以避免无效数据,然后使用转换可以将VARCAHR字段作为日期时间值。
根据示例数据,有效日期的最小长度为10个字符,因此可以在WHERE
子句中应用该条件。
示例执行:
DECLARE @GradedDETAILS TABLE (Gradd19 VARCHAR (30));
INSERT INTO @GradedDETAILS (Gradd19) VALUES
('Sep 16 2016 12:00AM'),
('Sep 16 2016 12:00AM'),
('Sep 16 2016 12:00AM'),
('Sep 19 2016 12:00AM'),
('Sep 19 2016 12:00AM'),
('Sep 16 2016 12:00AM'),
('20'),
('60'),
('20-09-2016'),
('20-09-2016');
SELECT CONVERT(VARCHAR(19), CONVERT(DATETIME, Gradd19, 105), 120)
FROM @GradedDETAILS
WHERE LEN(Gradd19) >= 10
因此,在实际查询中,还需要添加LEN(Gradd19) >= 10
条件,并在SELECT
中使用此条件将其转换为DATETIME
by CONVERT(VARCHAR(19), CONVERT(DATETIME, Gradd19, 105), 120)
发布于 2016-09-27 09:20:13
我不确定这是否是你的问题,但是- DateTime
不支持任何低于'1753-01-01‘的东西。如果值小于此值,则会产生您正在看到的错误。如果原始值较少,则可能需要应用CASE
表达式来计算该条件,并强制“1753-01-01”(或NULL
)(取决于您的情况)。
示例:
CASE
WHEN <TableColumn> < '1753-01-01' THEN '1753-01-01'
ELSE <TableColumn>
END AS <TableColumn>
https://dba.stackexchange.com/questions/150716
复制相似问题