Как получить дату финансового квартала по текущей дате - PullRequest
0 голосов
/ 24 декабря 2018

Кварталы, описанные ниже:

APRIL - JUNE   - Q1
JULY  - SEPT   - Q2
OCT   - DEC    - Q3
JAN   - MARCH  - Q4

Например:

Date = '2018-12-24'  -- Where this date is under third quarter

Так должно быть [Получите весь квартал <квартал текущей даты] </p>

---------------------------
Quarters
---------------------------
01 Jul 2018 - 30 Sep 2018
01 Apr 2018 - 30 Jun 2018
---------------------------

Если

Date = '2019-01-24' -- Where this date is under fourth quarter

Ожидаемый результат:

---------------------------
Quarters
---------------------------
01 Oct 2018 - 30 Dec 2018
01 Jul 2018 - 30 Sep 2018
01 Apr 2018 - 30 Jun 2018
---------------------------

Запрос, который я пробовал:

DECLARE @dt DATETIME = '2019-01-24 18:15:59.517' 
DECLARE @FirstDayOfQuarter DATETIME 
DECLARE @LastDayOfQuarter DATETIME 

SET @FirstDayOfQuarter = (SELECT Dateadd(qq, Datediff(qq, 0, @dt) - 1, 0)) 
SET @LastDayOfQuarter = (SELECT Dateadd(dd, -1, Dateadd(qq, Datediff(qq, 0, @dt) 
                                                , 0))) 

DECLARE @year INT 

SET @year = Datepart(year, @dt) 

DECLARE @currQ NVARCHAR(max) 

SET @currQ = (SELECT CONVERT(VARCHAR(20), @FirstDayOfQuarter, 106) 
                     + Space(1) + '-' + Space(1) 
                     + CONVERT(VARCHAR(20), @LastDayOfQuarter, 106)) 

SELECT CONVERT(NVARCHAR(20), Dateadd(m, 3*number, CONVERT(DATE, CONVERT(VARCHAR( 
       5), 
       @year)+'-1-1')), 106) 
       + Space(1) + '-' + Space(1) 
       + CONVERT(NVARCHAR(20), Dateadd(d, -1, Dateadd(m, 3*number+3, CONVERT( 
       DATE, 
       CONVERT(VARCHAR(5), @year)+'-1-1'))), 106) AS Quarter, 
       number, 
       CASE 
         WHEN @dt BETWEEN Dateadd(m, 3 * number, CONVERT(DATE, CONVERT(VARCHAR(5 
                                                               ), 
                                                               @year) + 
                                                               '-1-1')) AND 
                                 Dateadd(d, -1, Dateadd(m, 3 * number + 3, 
                                                CONVERT(DATE, CONVERT(VARCHAR(5) 
                                                              , 
                          @year 
                          ) + '-1-1'))) THEN 1 
         ELSE 0 
       END                                        AS isCurrentQuarter 
INTO   #allquarters 
FROM   master..spt_values 
WHERE  type = 'p' 
       AND number BETWEEN 1 AND 4 

SELECT TOP 1 number, 
             CASE 
               WHEN @dt BETWEEN Dateadd(m, 3 * number, 
                                CONVERT(DATE, CONVERT(VARCHAR(5), 
                                              @year) + 
                                              '-1-1')) AND 
                                       Dateadd(d, -1, Dateadd(m, 3 * number + 3, 
                                                      CONVERT(DATE, CONVERT( 
                                                      VARCHAR(5), 
                                @year 
                                ) + '-1-1'))) THEN 1 
               ELSE 0 
             END AS isCurrentQuarter 
INTO   #currentquarter 
FROM   master..spt_values 
WHERE  type = 'p' 
       AND number BETWEEN 1 AND 4 
ORDER  BY iscurrentquarter DESC, 
          number ASC 

SELECT quarter 
FROM   #allquarters 
WHERE  number < (SELECT number 
                 FROM   #currentquarter) 
ORDER  BY number DESC 

DROP TABLE #allquarters 

DROP TABLE #currentquarter 

Он работает для GETDATE(), но когдаЯ ставлю дату как 2019-01-24 18:15:59.517, тогда она дает мне пустой результат

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

Если

Date = '2019-05-24' -- Where this date is under first quarter of next year

Ожидаемый результат:

---------------------------
Quarters
---------------------------
01 Jan 2019 - 30 March 2019
01 Oct 2018 - 30 Dec 2018
01 Jul 2018 - 30 Sep 2018
01 Apr 2018 - 30 Jun 2018
---------------------------

Если

Date = '2018-05-24' -- Where this date is under the first quarter of current year

Ожидаемый результат:

---------------------------
Quarters
---------------------------
01 Jan 2018 - 30 March 2018
01 Oct 2017 - 30 Dec 2017
01 Jul 2017 - 30 Sep 2017
01 Apr 2017 - 30 Jun 2017
---------------------------

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Используйте формулу (n + 5) % 12 + 3 для преобразования номеров месяцев 1, 2, ..., 12 в 9, 10, ..., 14, 3, ..., 8, которые являются числом месяцев, которое необходимо вычестьс данной даты.В SQL Server 2008 его можно перевести как:

DATEADD(MONTH, DATEDIFF(MONTH, 0, inputdate) - ((MONTH(inputdate) + 5) % 12 + 3), 0)

Преобразование 2018-04-xx в 2017-04-01 и 2018-07-xx в 2018-04-01.Добавление 3, 6 и 9 месяцев тривиально.

DB Fiddle

0 голосов
/ 24 декабря 2018

Я полагаю, что это то, что вы хотите:

with dte as (
      select cast('2019-07-24' as date) as dte
     )
select dte,
       (convert(varchar(255), dateadd(month, v.n, datefromparts(year(dte), ((month(dte) - 1) / 3) * 3 + 1, 1)), 106) + ' - ' +
        convert(varchar(255), dateadd(day, -1, dateadd(month, v.n + 3, datefromparts(year(dte), ((month(dte) - 1) / 3) * 3 + 1, 1))), 106)
      ) as string 
from dte cross apply
     (values (0), (-3), (-6), (-9)) v(n)
where month(dte) < 4 or month(dte) >= 13 + v.n
order by v.n;

Здесь - это дб <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...