将 varchar 数据类型转换为 datetime 数据类型导致 TSQL 中的值超出范围

Posted

技术标签:

【中文标题】将 varchar 数据类型转换为 datetime 数据类型导致 TSQL 中的值超出范围【英文标题】:Conversion of a varchar data type to a datetime data type resulted in an out-of-range value in TSQL 【发布时间】:2017-09-28 12:29:37 【问题描述】:

在我的 T-SQL 选择中,我的日期时间似乎有错误

select 
    t.F47, t.F53, t.F40, t.F162, t.F163,
    N'10' as kostenart, t.F39, t.F2, t.F5,
    convert(nvarchar, cast(t.F9 as datetime), 112),
    t.PARID, 20170928135800 as exportzeitstempel  
from 
    T_TRANS6 as t 
where 
    t.F20 = N'Erledigt' 
    and t.F9 < convert(datetime, '01.09.2017 00:00:00', 104)

错误信息是德语,上面写着:

Meldung 242,Ebene 16,状态 3,Zeile 1 Bei der Konvertierung eines nvarchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs。

我试着把它翻译成:

将 char 数据类型转换为日期时间数据类型导致日期时间值超出范围。"

我真的不知道我是怎么做到的,谢谢大家的帮助

【问题讨论】:

看起来您在选择中将 F9 转换为日期时间,您可能还需要在 where 子句中执行此操作。 @JacobH 嘿,感谢您抽出宝贵时间,帮我,我不是已经这样做了吗? 我在 t.F9 的 where 子句中没有看到强制转换函数... 英文消息其实是:“将char数据类型转换为datetime数据类型导致datetime值超出范围。” 在典型的德国 SQL 服务器安装中,CAST('dd.MM.yyyy HH:mm:ss' as datetime) 通常可以工作,因为它是本地标准格式。 CONVERT 与 104 第三个参数实际上会尝试将日期时间转换为给定格式的 varchar。 【参考方案1】:

你的问题是由cast(t.F9 as datetime)触发的。

请使用:SELECT getdate(); 获取隐式的“日期时间到字符串”转换格式。

警告:在实例级别设置隐式转换格式。它可能因服务器而异,即使在同一公司中也是如此......

这会给你一些类似dd.MM.yyyy HH:mm:ssyyyy-MM-dd HH:mm:ss或...

给定的格式是所有 F9 TRANS6 表记录的预期和必需

具有错误格式模式的单个 TRANS6.F9 将引发此错误。所以分析你的 F9 数据,找到相关的行,清理它们并重试......

注意:CONVERT(NVARCHAR(8), getdate(),112) 得到一个类似YYYYMMDD 的字符串(例如:'20170928'),女巫是日期的唯一可排序字符串格式...

编辑:F9 = '2016.10.30' 和隐式转换期望 '2016-10-30' !!

试试这个:

select 
    t.F47, t.F53, t.F40, t.F162, t.F163,
    N'10' as kostenart, t.F39, t.F2, t.F5,
    convert(nvarchar, convert(datetime,t.F9,102), 112),
    t.PARID, 20170928135800 as exportzeitstempel  
from 
    T_TRANS6 as t 
where 
    t.F20 = N'Erledigt' 
    and t.F9 < convert(datetime, '01.09.2017 00:00:00', 104)

有效吗?

【讨论】:

所以我做了 SELECT getdata() 这就是结果:2017-09-28 15:12:04.050 我的F9里的数据是这样的2016.10.30

以上是关于将 varchar 数据类型转换为 datetime 数据类型导致 TSQL 中的值超出范围的主要内容,如果未能解决你的问题,请参考以下文章

即使没有 datetime 列,也获取“将 varchar 数据类型转换为 datetime 数据类型导致超出范围的值”

将 varchar 2007-12-19-11.57.1​​7.366731 转换为 datetime 数据类型

Polybase - 将数据类型 VARCHAR 转换为 DATETIME 时出错

如何解决“将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。”错误

消息 242:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围

System.Data.SqlClient.SQLException:将 varchar 数据类型转换为 datetime