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_Date
和c2.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.
答案 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