日付は Y2K 日付文字列形式です
例) 1120104
=20120104
SQL Server 2008 の実行
まず、この方法で日付を保存するのをやめます。
できない場合は、計算列を追加します (永続化および/またはインデックス化することもできます)。
ALTER TABLE dbo.MyTable ADD RealDate
AS CONVERT(DATE, RIGHT(col, 6), 12);
それができない場合は、ビューを作成します。
CREATE VIEW dbo.SmarterView
AS
SELECT /* other columns, */
RealDate = CONVERT(DATE, RIGHT(col, 6), 12)
FROM dbo.MyTable;
それで:
SELECT ... FROM dbo.MyTable -- or dbo.SmarterView
WHERE RealDate >= @Start
AND RealDate < DATEADD(DAY, 1, @End);
無制限の範囲ははるかに優れていますBETWEEN
-特に2月に月末を計算するのは面倒で、特に日付/時刻のデータ型が変更される可能性がある場合. 見る:
1900 年代の日付がある場合は、もう少し複雑です。
CONVERT(DATE, CONVERT(CHAR(2), 19 + CONVERT(INT, LEFT(col, 1))) + RIGHT(col, 6), 112);
いずれにせよ、OPはそれを.として正しく保存すると述べているので、それは無関係DATE
です.
Y2K の日付と別の日付を単純な同等性チェックで比較できるはずです。Y2K を変換する場合はDateTime
、19000000 を追加してから、次の例のように変換する必要があります。
DECLARE @Y2KDate INT
SET @Y2KDate = 1120104
DECLARE @DateTime DateTime
SET @DateTime = CONVERT(DATETIME, CONVERT(CHAR(8), @Y2KDate + 19000000), 112)
PRINT @DateTime
次の出力を出力します
1120104 20120104 Jan 4 2012 12:00AM
最初のアドバイス: 日付をデータ型 date または datetime として保存し、実際に検索できるようにします。
それを望まない場合は、最初に文字列を日付に変換して検索できるようにする必要があります。
where convert(date, my_nasty_string_column_with_dates) between @a and @b
クエリがインデックスをシークできないため、これはパフォーマンスの問題です。