6

もうここにはいない同僚が書いた SQL クエリがあります。クエリは SSIS ジョブの一部として実行され、今月の時点で、次のエラーで失敗し始めています。

varchar データ型を datetime データ型に変換すると、範囲外の値になりました。

@startdateクエリ自体は、特定の時間範囲 (との間の日付範囲@enddate)の値を検索する where 句を使用した単なる基本的な選択です。

時間範囲を決定するコードは次のとおりです。

DECLARE     @RunDateTime datetime
DECLARE     @RunDate datetime
DECLARE     @StartDate datetime
DECLARE     @EndDate datetime
DECLARE     @Month int
DECLARE     @Year int
DECLARE     @strStartDate varchar(10)

SET     @RunDateTime = GetDate()
SET     @RunDate = cast(round(convert(real, @RunDateTime),0,1) as datetime)

IF                  DATEPART(d, @RunDate) = 16
    BEGIN       
                    SET @StartDate =  DATEADD(d, -15, @RunDate)
                    SET @EndDate = @RunDate
    END
ELSE
    BEGIN
                    IF      Month(@RunDate) = 1
                            SET @Month = 12
                    ELSE    
                            SET @Month = Month(@RunDate) - 1

                    IF      Month(@RunDate) = 1
                            SET @Year = Year(@RunDate) - 1
                    ELSE
                            SET @Year = Year(@RunDate)

                    SET @strStartDate = CONVERT(varchar(2), @Month)+ '/16/' + CONVERT(varchar(4), @Year)
                    SET @StartDate = CONVERT(datetime, @strStartDate, 101)
                    SET @EndDate = @RunDate
    END

このジョブは月に 2 回実行されます。1日から15日までのデータは16日に1回、16日から前月末までのデータは翌月1日に1回。

私がオンラインで見つけることができるものから、varcharforの使用strStartDateが原因である可能性がありますか? 私はSQLに精通していないので、そこで行われているすべての変換を置き換える方法を知っていますか? また、実行時間を取得するだけでなく、月末の日付を決定するためのより良い方法はありますか? どんな助けでも大歓迎です。

(追伸、私たちはこのジョブを SQL Server 2008 R2 で実行しています) DBA に確認したところ、ローカリゼーションや地域設定については SQL サーバーで何も変更されていないとのことでした。

4

1 に答える 1

4

SQL Server では多くの形式がサポートされています。CAST および CONVERT については、MSDN Books Online を参照してください。これらの形式のほとんどは、使用している設定に依存します。したがって、これらの設定が機能する場合と機能しない場合があります。

これを解決する方法は、SQL Server でサポートされている (少し変更された) ISO-8601 日付形式を使用することです。この形式は、SQL Server の言語と日付形式の設定に関係なく、常に機能します。

ISO-8601 形式は SQL Server でサポートされており、次の 2 つの形式があります。

  • YYYYMMDD日付のみ (時間部分なし)。ここに注意してください:ダッシュはありません! 、それは非常に重要です! SQL Server の dateformat 設定とは無関係ではなく、すべての状況で機能するとは限りYYYY-MM-DDませ!

また:

  • YYYY-MM-DDTHH:MM:SS日付と時刻 - ここに注意してください: この形式にはダッシュ (ただし、省略可能T) があり、DATETIME.

これは、SQL Server 2000 以降で有効です。

SQL Server 2008 以降とDATEデータ型 (のみDATE-ではなく DATETIME!) を使用する場合、実際にYYYY-MM-DD形式も使用でき、SQL Server の任意の設定でも機能します。

また、SQL Server 2008 では、可能であればDATETIME2(の代わりにDATETIME) を使用することをお勧めします。DATETIME2文字列の解析は、エラーやさまざまな形式 (米国の AM/PM 形式など) に対してより寛容です。

なぜこのトピック全体が非常にトリッキーでやや混乱するのか、私に聞かないでください。ただし、このYYYYMMDD形式では、SQL Server のどのバージョンでも、SQL Server の言語と日付形式の設定でも問題ありません。

于 2013-01-02T15:39:23.760 に答える