2017-09-15 4 views
0
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 

私は助けてもらえますか?以下のスクリプトの第3列の日付変換に関する問題が発生しています

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

あなたが使用しているDBMSにタグを付けます。日付/時刻に関しては、多くの製品がANSI SQL準拠のものとはまったく異なります。 – jarlh

+0

あなたの 'c2.CDS_Date'はどんな型ですか - 私は日付ではなくvarcharでしょうか? – Arvo

+0

CDS_Dateで注文し、テーブル内の日付が1753未満であることを確認してください。多分それが助けになるでしょう。たぶんSQLの最小日付に非常に近いので、エラーがあります。 – Arkadiusz

答えて

1

あなたCDS_Datedate/datetimeタイプではありませんが、文字列であるからです。 EVEN場合は、それが有効なデータを表していることをあなたに思わ

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に変換することができないことを示しています。ここ

は一例です。これは、サーバーがセッション言語に依存する特定の形式になる文字列として渡す日付を期待するためです。

セッション言語とは関係なく、変換関数を使用して日付文字列を渡し、日付の形式を指定します。

私の例では、私はstyle 103dateに変換する問題を修正することができます

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

今ではそれが私の入力文字列がdd/mm/yyyy

すなわち、 103 formatであることを知っているという理由だけで、私に両方の言語で正しい結果が得られます
+0

それは働いた。どうもありがとうございました – Jeje

関連する問題