テーブルにINT列があります。この列には日付が特殊な形式で格納されます。その列をDATE型に変換しようとしています。月末に例外を含むSQL Serverの数値を日付に変換する
例えば、'2016-03-14'
を20160314
とします。
例外は、毎月の最後の日に、私たちは日を保存していません。 したがって'2016-03-31'
の場合は201603
を保存し、数字がless than 999999
かどうかを判断する必要があります。見つからない場合は、月末または月の他の日を表します。これは、すべての数学式である
:
クエリ1:
はこれまでのところ、私はこのタスクを達成するために、2つのクエリを持っています。
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(DATEFROMPARTS(@k /100, @k % 100, 1), 0)
, DATEFROMPARTS(@k /10000, (@k/100) % 100, @k % 100)
)
クエリ2: この1つは、文字列操作を使用しています。
declare @k int = 20160321
--declare @k int = 201603
select
IIF(@k < 999999
, EOMONTH(cast(LEFT(@k, 4) + '-' + RIGHT(@k, 2) + '-01' as date), 0)
, cast(LEFT(@k, 4) + '-' + RIGHT(LEFT(@k, 6), 2) + '-' + RIGHT(@k, 2) as date)
) AS DateColumn
WHERE
節で変換式を行う必要があります。
SELECT K, Dt, Name -- and more fields
FROM tbl
WHERE IIF(K < 999999
, EOMONTH(DATEFROMPARTS(K /100, K % 100, 1), 0)
, DATEFROMPARTS(K /10000, (K/100) % 100, K % 100)
) < GetDate()
そしてperformance is important
質問:何かのようにこれを行うには良い方法はありますか?おそらく、SQL ServerがK列にあるクラスタードインデックスを使用できる方法です。
@hvd彼はそうではありません。彼は月の最終日の日付を返すEOMONTH()関数を使用しています。 –
@hvd - 私は彼が 'EOMONTH'関数を呼び出すことによってそれをカバーしていると思います。 –
はい、みんな。私がやったことに非常によく似たいくつかの方法があるかもしれません。その獣の事例はSQL ServerがK列にあるクラスタ化インデックスを使用できるようにするためのものです。これを問題の本文に追加します。 – FLICKER