日なしで2つの日付の間のデータを選択したい
入力例:
開始月: 9 、開始年: 2011
終了月: 3、終了年: 2012
これには2つの方法があると思います。
1 つ目は、開始月と開始年を日付2011-09-01
に変換し、最終日を に変換します2012-03-31
が、これには終了月の最終日の計算が必要です。これらの日付を取得したら、WHERE 句に BEETWEN 関数を使用できます (ただし、CONVERT 関数は信頼できますか?)
DATEPART
2 番目の解決策は、次のコードのように関数を使用することです。
説明しようとします。終了年が最初の年と等しい場合、月は開始月と終了月の間にある必要があります。そうでなければ、最後の月が最初の年よりも大きい場合、最初の年と最後の年が異なる場合は、その間のすべてを取ります。それ以外の場合、最終年、月は最終月以下でなければなりません。最初の年、月は最終月以上でなければなりません。
これを最善の方法で行うのを手伝ってもらえますか? 私が採用した解決策は正しいですか?
declare @IndDebitoCredito bit,@ProgTributo int,@mi as integer,@ai as integer,@mf as integer,@af as integer,@IDAnagrafica varchar(5)
select @mi = 01,@ai = 2011,@mf = 12,@af = 2011,@IDAnagrafica = 'DELEL',@IndDebitoCredito = 1
select distinct rrd.IDTributo
from TBWH_Delega d
--inner join TBWH_SezioneDelega sd on d.IDDelega = sd.IDDelega
inner join TBWH_Rigo rd on rd.IDDelega = d.IDDelega
inner join TBWH_RataRigo rrd on rrd.IDRigo = rd.IDRigo
where
(
DATEPART(MM,d.DataDelega)<=@mf and
DATEPART(MM,d.DataDelega)>=@mi and
DATEPART(YYYY,d.DataDelega)=@ai and
@af = @ai
)
OR
(
--anno finale magg. anno iniziale
@af > @ai AND
(
( -- delega nell'intervallo
DATEPART(YYYY,d.DataDelega)<@af AND
DATEPART(YYYY,d.DataDelega)>@ai
-- DATEPART(MM,d.DataDelega)>=@mi
)
OR
( -- delega limite destro
DATEPART(YYYY,d.DataDelega)=@af AND
DATEPART(MM,d.DataDelega)<=@mf
)
OR
( -- delega limite sinistro
DATEPART(YYYY,d.DataDelega)=@ai AND
DATEPART(MM,d.DataDelega)>=@mi
)
)
)
行く