首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将varchar值插入datetime字段时,会引发转换错误。

将varchar值插入datetime字段时,会引发转换错误。
EN

Database Administration用户
提问于 2016-09-27 04:52:37
回答 2查看 8.2K关注 0票数 1

FROM_DATE列是temptable1stockdetails表中的DATETIME格式。

Gradd19列是GradedDETAILS表中的VARCHAR格式。

我想将Gradd19值插入到FROM_DATE,但它引发以下错误:

将varchar数据类型转换为日期时间数据类型会导致超出范围的值。语句已被终止

我该如何解决这个问题。

Gradd19表中的GradedDETAILS示例数据如下:

代码语言:javascript
复制
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
EN

回答 2

Database Administration用户

发布于 2016-09-27 06:44:50

由于您没有共享Gradd19值的示例数据,所以我怀疑日期值是yyyy-dd-mm格式的,所以当尝试转换(月份值超过12)时,会导致超出范围的值错误。

对于示例,如果yyyy-mm-dd中的日期格式,它将正确执行:

代码语言:javascript
复制
DECLARE @FromDate DATETIME;
DECLARE @Gradd19 AS VARCHAR (20) = '2016-11-15';
SELECT @FromDate = CONVERT(VARCHAR, @Gradd19, 105);
SELECT @FromDate;

如果是在yyyy-dd-mm中,则会抛出超出范围的值错误。

代码语言:javascript
复制
DECLARE @FromDate1 DATETIME;
DECLARE @Gradd191 AS VARCHAR (20) = '2016-15-11';
SELECT @FromDate1 = CONVERT(VARCHAR, @Gradd191, 105); 
SELECT @FromDate1;

因此,在这种情况下,您需要再进行一次转换,以跳过问题,如下所示:

代码语言:javascript
复制
DECLARE @FromDate2 DATETIME;
DECLARE @Gradd192 AS VARCHAR (20) = '2016-15-11';
SELECT @FromDate2 = CONVERT(VARCHAR(19), CONVERT(DATETIME, @Gradd192, 105), 120)
SELECT @FromDate2;

所以而不是

代码语言:javascript
复制
CONVERT(VARCHAR, Gradd19, 105) AS ExpiryDate

你需要用

代码语言:javascript
复制
CONVERT(VARCHAR(19), CONVERT(DATETIME, Gradd19, 105), 120) AS ExpiryDate

更新:正如您在注释中提到的,Gradd19的值为2060,很难过滤那些无效的数据。但是,基于LEN()函数,您可以避免无效数据,然后使用转换可以将VARCAHR字段作为日期时间值。

根据示例数据,有效日期的最小长度为10个字符,因此可以在WHERE子句中应用该条件。

示例执行:

代码语言:javascript
复制
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)

票数 1
EN

Database Administration用户

发布于 2016-09-27 09:20:13

我不确定这是否是你的问题,但是- DateTime不支持任何低于'1753-01-01‘的东西。如果值小于此值,则会产生您正在看到的错误。如果原始值较少,则可能需要应用CASE表达式来计算该条件,并强制“1753-01-01”(或NULL )(取决于您的情况)。

示例:

代码语言:javascript
复制
CASE 
    WHEN <TableColumn> < '1753-01-01' THEN '1753-01-01' 
    ELSE <TableColumn> 
END AS <TableColumn>
票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/150716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档