1

今日が2012年8月15日である場合、クエリは次を返す必要があります

15/01/2011,
15/02/2011,
...
...
15/07/2012
15/08/2012

今日が2012年8月31日の場合、クエリは次のようになります。

31/01/2011,
28/02/2011,  <<<<this is the nearest date
...
...
31/07/2012
31/08/2012

倉庫にvw_DimDateがあります。

編集 次のフィールドが含まれています

ここに画像の説明を入力してください

現在、以下を使用していますが、かなり複雑なようです!..。

DECLARE @Dt DATETIME = '31 JUL 2012'--GETDATE()

;WITH DateSet_cte(DayMarker)
        AS
        (
        SELECT DayMarker
        FROM WHData.dbo.vw_DimDate
        WHERE 
                DayMarker >= CONVERT(DATETIME,CONVERT(CHAR(4),DATEADD(YEAR,-1,@Dt),112) + '0101') AND
                DayMarker <=@Dt
        )
, MaxDate_cte(MaxDate)
        AS
        (
        SELECT [MaxDate] = MAX(DayMarker)
        FROM DateSet_cte 
        )       
SELECT
            [Mth] = CONVERT(DATETIME,CONVERT(CHAR(6),a.DayMarker,112) + '01')
            , MAX(a.DayMarker) [EquivDate]
FROM DateSet_cte a
WHERE DAY(a.DayMarker) <= (SELECT DAY([MaxDate]) FROM MaxDate_cte)
GROUP BY CONVERT(DATETIME,CONVERT(CHAR(6),a.DayMarker,112) + '01')
4

1 に答える 1

2
;with Numbers as (
    select distinct number from master..spt_values where number between 0 and 23
), Today as (
    select CONVERT(date,CURRENT_TIMESTAMP) as d
)
select
    DATEADD(month,-number,d)
from
    Numbers,Today
where DATEPART(year,DATEADD(month,-number,d)) >= DATEPART(year,d) - 1

私たちが1年を通してどれだけ離れているかに基づいて、可変数の戻り値が必要なのは奇妙に思えますが、それは私が実装したものです。

を使用DATEADDして値にsを追加するmonthと、範囲外の日付(2月31日など)が生成された場合に、その月の最後の日になるように、日番号が自動的に調整されます。または、ドキュメントに記載されているように:

datepartであり、日付月が戻り月よりも日数が多く、日付日が戻り月に存在しない場合、戻り月の最終日が返されます。

もちろん、データベースにすでに数値テーブルがある場合は、最初のCTEを削除できます。「ウェアハウスにvw_DimDateがあるので、役立つはずです」とおっしゃっていましたが、その(おそらくa)ビューに何が含まれているかわからないため、役に立ちませんでした。

于 2012-08-15T12:16:59.673 に答える