我在下面的脚本中有第3列的日期转换问题

时间:2017-09-15 11:02:49

标签: sql sql-server

Select c1.CDS_Date, c2.CDS_Date, Dateadd(day, -1 , c2.CDS_Date) 
from cte as c1 left join 
     cte as c2  
     on c1.[Local Patient Identifier] = c2.[Local Patient Identifier] and 
        c1.JoinKey = c2.JoinKey - 1

请问我能来帮忙吗?

我对c1.CDS_Datec2.CDS_Date没有任何问题。

我在收到第3列时收到以下错误消息:

(24 rows affected)
Msg 242, Level 16, State 3, Line 50
The conversion of a varchar data type to a datetime data type resulted in an --out-of-range value.

1 个答案:

答案 0 :(得分:1)

这是因为您的CDS_Date不是date / datetime类型,而是字符串。

以下是一个例子:

declare @t table (CDS_Date varchar(100));
insert into @t values ('28/10/2017');

set language British;
select CDS_Date, dateadd(day, -1, CDS_Date) as dt
from @t;
-------
--CDS_Date  dt
--28/10/2017    2017-10-27 00:00:00.000


set language us_english;
select CDS_Date, dateadd(day, -1, CDS_Date) as dt
from @t;

--Msg 242, Level 16, State 3, Line 40
--The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

此示例向您显示并非每个字符串都可以转换为date即使您认为它代表了有效数据。这是因为服务器期望您作为字符串传递的日期采用依赖于会话语言的特定格式。

要独立于会话语言,您应使用转换函数传递日期字符串并指定日期格式。

在我的示例中,我可以解决使用date转换为style 103的问题:

select CDS_Date, dateadd(day, -1, convert(date, CDS_Date, 103)) as dt
from @t;
----
--CDS_Date  dt
--28/10/2017    2017-10-27

现在它只是因为它知道我的输入字符串是103 format,即dd/mm/yyyy

,它在两种语言中都给出了正确的结果