Порядок сортировки дат между датами - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть две даты в качестве параметров и список текущих дат и тех же периодов предыдущих лет.Мне нужен список разделов между параметрами.Логика: если дата между «20171201» И «20180301», то 1, если дата между «20161201» и «20170301», то 2 и т. Д.Но количество периодов в списке не статично, например:

DECLARE @DateEnd DATE = '20180331'
  , @DateBeg DATE = '20171201'

DECLARE @tab TABLE([date] DATE)
INSERT INTO @tab ([date])
VALUES('2014-12-01')
, ('2015-01-01')
, ('2015-02-01')
, ('2015-03-01')
, ('2015-12-01')
, ('2016-01-01')
, ('2016-02-01')
, ('2016-03-01')
, ('2016-12-01')
, ('2017-01-01')
, ('2017-02-01')
, ('2017-03-01')
, ('2017-12-01')
, ('2018-01-01')
, ('2018-02-01')
, ('2018-03-01')

Результат должен быть

Date        Cnt
2014-12-01  4
2015-01-01  4
2015-02-01  4
2015-03-01  4
2015-12-01  3
2016-01-01  3
2016-02-01  3
2016-03-01  3
2016-12-01  2
2017-01-01  2
2017-02-01  2
2017-03-01  2
2017-12-01  1
2018-01-01  1
2018-02-01  1
2018-03-01  1

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Использование dateadd () в выражении регистра должно включить это:

select
  datecol
, case when datecol between @DateBeg and @DateEnd then 1 
       when datecol between dateadd(year,-1,@DateBeg) and dateadd(year,-1,@DateEnd) then 2
       when datecol between dateadd(year,-2,@DateBeg) and dateadd(year,-2,@DateEnd) then 3
       when datecol between dateadd(year,-3,@DateBeg) and dateadd(year,-3,@DateEnd) then 4
  end
from @tab

также см .: http://rextester.com/BTF82190

0 голосов
/ 28 сентября 2018

используйте CASE WHEN satetement, чтобы проверить дату и вернуть значение соответственно

select  *, 
        Cnt = CASE 
              WHEN date BETWEEN '20171201' AND '20180331' THEN 1
              WHEN date BETWEEN '20161201' AND '20170331' THEN 2            
              WHEN date BETWEEN '20151201' AND '20160331' THEN 3
              WHEN date BETWEEN '20141201' AND '20150331' THEN 4            
              END
from    @tab

РЕДАКТИРОВАТЬ:

Или, может быть, это то, что вы хотите?

этодаст вам начало финансового года

dateadd(month, - month(date) % 12, date)

у вас Cnt нет лет между финансовым годом и сегодняшним днем?

select  *, 
        Cnt = datediff(year, dateadd(month, - month(date) % 12, date), getdate())
from    @tab
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...