もうここにはいない同僚が書いた 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回。
私がオンラインで見つけることができるものから、varchar
forの使用strStartDate
が原因である可能性がありますか? 私はSQLに精通していないので、そこで行われているすべての変換を置き換える方法を知っていますか? また、実行時間を取得するだけでなく、月末の日付を決定するためのより良い方法はありますか? どんな助けでも大歓迎です。
(追伸、私たちはこのジョブを SQL Server 2008 R2 で実行しています) DBA に確認したところ、ローカリゼーションや地域設定については SQL サーバーで何も変更されていないとのことでした。