0

サーバーの日付形式が原因で、スクリプトが失敗します。

declare @lastDay as datetime
declare @endDay as datetime

set @lastDay = '2012-07-12 18:00:00.000'
set @endDay = '2012-07-16 18:00:00.000'

Select getdate(), @lastDay, @endDay

上記のコードでは、割り当てたデータは (yyyy-mm-dd hh:mi:ss.mmm) 形式です。しかし、sqlserver はこれを (yyyy-dd-mm hh:mi:ss.mmm) と見なします。

しかし、getdate() 関数を使用すると、SQL は (yyyy-mm-dd hh:mi:ss.mmm) 形式で返されます。問題は、値を割り当てたときにのみ発生します。

同じコードが PC では正常に動作しますが、サーバーでは失敗します。

上記のコードのサーバーで取得した結果は次のとおりです

2012-07-17 15:34:30.627    2012-12-07 18:00:00.000      NULL

そしてエラーメッセージ付き

The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

変換機能を使用できることはわかっていますが、現在サーバーでスケジュールする必要がある dts ジョブが数百あります。これは、各パッケージを確認するための簡単な解決策ではありません。

デフォルトで (yyyy-mm-dd hh:mi:ss.mmm) を考慮するために、サーバー上のいくつかの設定を変更する必要があると思います。誰かがこれを修正する解決策を知っているなら、私を助けてください。

4

2 に答える 2

2

YYYY-MM-DDは、たとえば言語がフランス語の場合は機能しません。

あなたは言うことができます:

SET @lastDay = CONVERT(DATETIME, '2012-07-12 18:00', 120);

ただし、より安全な形式を使用する方がはるかに安全であり、変換の必要性を回避できます。

SET @lastDay = '20120712 18:00:00.000';

または、ダッシュが本当に必要な場合は、Tセパレータを追加します。これにより、地域の設定が上書きされなくなります。

SET @lastDay = '2012-07-12T18:00:00.000';

フォーマットを修正することの良いところは、サーバーの地域設定を変更することでこれを「修正」するとしましょう。この「修正」は、他の誰かが設定を元に戻すまで、または他の何かを壊すまで、またはコードを別のサーバーに移動するまでのみ機能します。安全な形式で渡すと、これらすべての問題が回避されます。

于 2012-07-17T15:04:27.153 に答える
-1

これに対する解決策は、ユーザープロファイルにあります。ユーザーのデフォルト言語を「英国英語」から「英語」に変更しましたが、すべて正常です。

また、迅速な対応をありがとうございます。あなたの回答から追加の知識を得ることができます。

ありがとう。

于 2012-07-17T15:35:48.350 に答える