テーブルに INT 列があります。この列には、日付が特別な形式で格納されます。その列をDATE型に変換しようとしています。
たとえば、 として保持'2016-03-14'
し20160314
ます。
例外として、各月の最終日は日を保存しません。そのため、'2016-03-31'
私たちが保存しているため、数字が月末または月の他の日を表すか201603
どうかを検討する必要があります。less than 999999
これまでのところ、このタスクを達成するために 2 つのクエリがあります。
クエリ 1:
これはすべて数学の公式です。
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: これは文字列操作を使用しています。
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 列にあるクラスター化インデックスを使用できる方法です。