-2

日付は Y2K 日付文字列形式です

例) 1120104=20120104

SQL Server 2008 の実行

4

3 に答える 3

3

まず、この方法で日付を保存するのをやめます。

できない場合は、計算列を追加します (永続化および/またはインデックス化することもできます)。

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です.

于 2013-03-06T17:39:34.340 に答える
1

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
于 2013-03-06T17:42:51.830 に答える
1

最初のアドバイス: 日付をデータ型 date または datetime として保存し、実際に検索できるようにします。

それを望まない場合は、最初に文字列を日付に変換して検索できるようにする必要があります。

where convert(date, my_nasty_string_column_with_dates) between @a and @b

クエリがインデックスをシークできないため、これはパフォーマンスの問題です。

于 2013-03-06T17:27:34.883 に答える