web-dev-qa-db-ja.com

varcharデータ型からdatetimeデータ型への変換は、範囲外の値になりました

C#Windowsサービスから実行する次のインラインSQLがあります。

UPDATE table_name SET 
    status_cd = '2', 
    sdate = CAST('03/28/2011 18:03:40' AS DATETIME), 
    bat_id = '33acff9b-e2b4-410e-baaf-417656e3c255', 
    cnt = 1, 
    attempt_date = CAST('03/28/2011 18:03:40' AS DATETIME) 
WHERE id = '1855'

アプリケーション内からSQL Serverデータベースに対してこれを実行すると、次のエラーが表示されます。

System.Data.SqlClient.SqlException:varcharデータ型からdatetimeデータ型への変換の結果、値が範囲外になりました。ステートメントは終了されました。

しかし、SQLの一部をSQL Management Studioから実行すると、問題なく実行されます。

この問題の原因は何ですか?

31
amateur

あいまいな日付形式は、ログインの言語に従って解釈されます。これは動作します

set dateformat mdy

select CAST('03/28/2011 18:03:40' AS DATETIME)

これはしません

set dateformat dmy

select CAST('03/28/2011 18:03:40' AS DATETIME)

正しいデータ型でパラメーター化されたクエリを使用すると、これらの問題を回避できます。 nambiguous "unseparated" format yyyyMMdd hh:mm:ss

64
Martin Smith

しかし、SQLの一部を取り、SQL管理スタジオから実行すると、問題なく実行されます。

自由な場合は、サービスアカウントを独自のログインに変更します。これにより、言語/地域の属性が継承されます。

問題の本当の核心は次のとおりです。

以下を使用して変換します-> date.Value.ToString( "MM/dd/yyyy HH:mm:ss")

将来これらの問題が発生しないように、パラメーター化されたクエリの使用を開始してください。また、より堅牢で予測可能でベストプラクティスです。

13
RichardTheKiwi

もちろん、C#とSQLの間の日付を操作する最良の方法は、パラメーター化されたクエリを使用し、常にC#のDateTimeオブジェクトとそれが提供するToString()形式オプションを操作することだと思います。

SQL Serverで日付を操作する前に_set datetime <format>_( dateformatの説明がMSDN にあります)を実行することをお勧めします。たとえば、_set datetime ymd_など。開いている間はフォーマットを保持するため、接続ごとに一度だけ行う必要があります。したがって、データベースへの接続を開いた直後に行うことをお勧めします。
その後、常に「yyyy-MM-dd HH:mm:ss:ffff」形式で作業できます。

DateTimeオブジェクトをパラメーター化されたクエリに渡すには、DateTime.ToString('yyyy-MM-dd HH:mm:ss:ffff')を使用できます。

C#で奇妙な形式の日付を解析するには、DateTime.ParseExact()メソッドを使用できます。この場合、入力フォーマットを正確に指定するオプションがあります:DateTime.ParseExact(<some date string>, 'dd/MM-yyyy',CultureInfo.InvariantCulture)ここに、MSDN でDateTime.ParseExact()の説明があります)

7
Iván Sainz

これは日付形式の問題です。アイルランドでは、3月28日の標準日付形式は「28-03-2011」になりますが、「03/28/2011」は米国の標準です(他の多くのものもあります)。

1
srgerg

私はこの解決策がOPの場合とは少し異なることを知っていますが、あなたがGoogleでこの質問のタイトルを検索することからここにリダイレクトされたかもしれないので、私がしたように、あなたは私と同じ問題に直面しているかもしれません。
日付時刻が無効であるためにこのエラーが発生することがあります。つまり、日付(文字列形式)がその月の日数を超えるを指している場合です。例:CONVERT(Datetime, '2015-06-31')が原因でこのエラーが発生しましたが、ステートメントをMySql(議論しなかった!エラーをキャッチするのが非常に難しくなりました)からSQL Serverに変換していました。

1
mok

Java8:LocalDateTime.now()。toString()を使用します

0
ariabele