Я хотел бы выбрать данные между двумя датами, без дня
Пример ввода:
месяц начала: 9, год начала: 2011
последний месяц: 3, последний год: 2012
Я думаю, что есть два способа сделать это.
Первый - конвертировать начальный месяц и начальный год в дату, например 2011-09-01
, и конвертировать последнюю дату в 2012-03-31
, но для этого требуется вычислить последний день месяца окончания. Получив эти данные, мы можем использовать функцию BEETWEN для предложения WHERE (но надежна ли функция CONVERT?)
Второе решение - использовать функцию DATEPART
, как показано в следующем коде:
Я пытаюсь объяснить: если конечный год равен начальному году, то месяц должен быть между начальным и конечным месяцами; иначе, если последние месяцы больше начальных, если они отличаются от начального и последнего года, я беру все промежуточное; иначе, если последний год, месяц должен быть меньше или равен последнему месяцу, если начальный год, месяц должен быть больше или равен последнему месяцу
Можете ли вы помочь мне сделать это наилучшим образом? Это правильно, решение я принял?
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
)
)
)
GO