2

SQLServer2000を使用します。開始日が06/23/2008で終了日が06/30/2008

次に、クエリの出力が必要です。

06/23/2008
06/24/2008
06/25/2008
.
.
.
06/30/2008

1列の整数としてテーブル名を作成しました。列の値は0、1、2、3、4、5、6、7、8、9です。次に、以下のクエリを使用しました。

クエリを試しました

SELECT DATEADD(d, H.i * 100 + T .i * 10 + U.i, '" & dtpfrom.Value & "') AS Dates 
  FROM integers H 
CROSS JOIN integers T 
CROSS JOIN integers U 
order by dates

上記のクエリは999日付のみを表示しています。999日付とは、(365 + 365 + 269)日付のみを意味します。3年以上(2003年1月1日から2008年1月1日まで)を選択するとします。上記のクエリは適切ではありません。

クエリを変更するにはどうすればよいですか?または、上記の条件に対して他のクエリを使用できます。

クエリを教えてください。

4

4 に答える 4

4

日付のリストを作成するためにループするのではなく、Numbersテーブル(0から9の値のテーブルだけでなく)を使用します。これらは多くのことに役立ちます:http://web.archive.org/web/20150411042510/http ://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html真の数値テーブルを使用すると、何度もクロスジョインして、クエリが複雑すぎます。

この方法を機能させるには、次の1つのタイムテーブルの設定を行う必要があります。

SELECT TOP 10000 IDENTITY(int,1,1) AS Number
    INTO Numbers
    FROM sys.columns s1
    CROSS JOIN sys.columns s2
ALTER TABLE Numbers ADD CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED (Number)

Numbersテーブルを設定したら、次のクエリを使用します。

SELECT
    @Start+Number-1
    FROM Numbers
    WHERE Number<=DATEDIFF(day,@Start,@End)+1

それらをキャプチャするには:

DECLARE  @Start datetime
         ,@End  datetime
DECLARE @AllDates table
        (Date datetime)

SELECT @Start = '06/23/2008', @End = '06/30/2008'

INSERT INTO @AllDates
        (Date)
    SELECT
        @Start+Number-1
        FROM Numbers
        WHERE Number<=DATEDIFF(day,@Start,@End)+1

SELECT * FROM @AllDates

出力:

Date
-----------------------
2008-06-23 00:00:00.000
2008-06-24 00:00:00.000
2008-06-25 00:00:00.000
2008-06-26 00:00:00.000
2008-06-27 00:00:00.000
2008-06-28 00:00:00.000
2008-06-29 00:00:00.000
2008-06-30 00:00:00.000

(8 row(s) affected)
于 2009-09-29T13:27:59.440 に答える
3

1つの可能な方法(それが最良または最も効率的であるとは言わない)は次のようになります:

DECLARE @StartDate DATETIME
SET @StartDate = '06/23/2008'

DECLARE @EndDate DATETIME 
SET @EndDate = '06/30/2008'

DECLARE @TableOfDates TABLE(DateValue DATETIME)

DECLARE @CurrentDate DATETIME

SET @CurrentDate = @startDate

WHILE @CurrentDate <= @endDate
BEGIN
    INSERT INTO @TableOfDates(DateValue) VALUES (@CurrentDate)

    SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate)
END

SELECT * FROM @TableOfDates

これは、任意の数の日付、任意の範囲の日付で機能し、整数値を持つ特定の「ヘルパー」テーブルを必要としません。

関連するすべての日付をメモリ内のテーブル変数に格納するため、別のSELECTステートメントや必要なものなどに使用できます。

マーク

于 2009-09-29T05:33:16.073 に答える
2

見る:

補助カレンダーテーブルの使用を検討する必要があるのはなぜですか?

カレンダーテーブルを使用すると、日付を含むあらゆるビジネスモデルに関するソリューションの開発がはるかに簡単になります。最後に確認したところ、これには、ある程度、考えられるほぼすべてのビジネスモデルが含まれます。冗長で複雑で非効率的な方法を必要とする結果となる絶え間ない問​​題には、次の質問が含まれます。

  • xとyの間は何営業日ですか?
  • ..。
于 2009-09-29T08:59:59.143 に答える
0

これにより、最大100、000日かかります。

SELECT DATEADD(d, Y.i * 10000 + X.i * 1000 + H.i * 100 + T .i * 10 + U.i, '" & dtpfrom.Value & "') AS Dates 
FROM integers H 
CROSS JOIN integers T 
CROSS JOIN integers U 
CROSS JOIN integers X 
CROSS JOIN integers Y 
order by dates
于 2009-09-29T12:28:24.287 に答える