将varchar数据类型转换为日期时间数据类型会导致TSQL中的超出范围值

时间:2017-09-28 12:29:38

标签: sql-server tsql datetime

在我的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,Status 3,Zeile 1
  Bei der Konvertierung eine nvarchar-Datentyps in einen datetime-Datentyp liegt derWertaußerhalbdesgültigenBereichs。

我试图将其翻译为:

  

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

我真的不知道我是怎么做的,所以感谢任何帮助人员

1 个答案:

答案 0 :(得分:2)

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

请执行:SELECT getdate();以获取隐含的“datetime to string”转换格式。

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

这会让您感觉像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)

有效吗?