Подсчитайте, сколько месяцев произошло в январе между двумя датами в SQL - PullRequest
4 голосов
/ 14 октября 2019

Мне нужно узнать, сколько января произошло между двумя датами в TSQL.

Т.е. если был включен какой-либо день в январе в определенном году, то это считается как 1 в год, а не несколько раз в месяц.

В качестве примера, следующее даст результат = 1

declare @date1 datetime = '2018-09-01 00:00:00.000';
declare @date2 datetime = '2019-02-01 00:00:00.000';

В качестве примера, следующее даст результат = 1, поскольку в январе был 1 день

declare @date1 datetime = '2018-09-01 00:00:00.000';
declare @date2 datetime = '2019-01-01 00:00:00.000';

В качестве примера следующее даст результат = 0, поскольку в январе не было дней

declare @date1 datetime = '2018-09-01 00:00:00.000';
declare @date2 datetime = '2018-11-01 00:00:00.000';

В качестве примера, следующий результат даст результат = 2 какбыло два события января

declare @date1 datetime = '2017-09-01 00:00:00.000';
declare @date2 datetime = '2019-11-01 00:00:00.000';

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Попробуйте использовать DATEDIFF() и DATEPART().

Вы можете проверить, находятся ли даты начала и окончания за пределами даты января, а затем добавить-1 ...

DECLARE @startdate AS DATETIME = '2015-02-01'
DECLARE @enddate   AS DATETIME = '2019-06-01'

SELECT
    DATEDIFF(yy, @startdate, @enddate) 
    + 1 
    + CASE 
        WHEN DATEPART(m, @startdate) > 1 AND 
           DATEPART(m, @enddate) > 1 
        THEN -1
        ELSE  0
    END 

Однако я не уверен, насколько быстро это будет для больших наборов данных. Если вы собираетесь сравнивать множество данных с определенным набором даты / времени, я бы порекомендовал проверить ответ Белки .

Чтобы изменить это для другого месяца, просто измените CASE предложение вроде так ...

+ CASE 
    WHEN DATEPART(m, @startdate) < 2 AND DATEPART(m, @startdate) > 2 AND 
         DATEPART(m, @enddate)   < 2 AND DATEPART(m, @enddate)   > 2 

2 в операторе CASE - это месяц, поэтому просто измените его на соответствующий номер месяца.

Если вы хотитехотел бы изменить это для любого месяца, а затем включить параметр для номера месяца, который вы ищете ...

+ CASE 
    WHEN DATEPART(m, @startdate) < @month_number AND 
         DATEPART(m, @startdate) > @month_number AND 
         DATEPART(m, @enddate)   < @month_number AND 
         DATEPART(m, @enddate)   > @month_number 

Это также можно превратить в функцию (UDF) .

2 голосов
/ 14 октября 2019

один из способов - это рекурсивный CTE для генерации различного месяца и подсчета для Jan

declare @date1 datetime = '2018-09-01 00:00:00.000';
declare @date2 datetime = '2019-02-01 00:00:00.000';

; with rcte as
(
    select  [date] = @date1
    union all
    select  [date] = dateadd(month, 1, [date])
    from    rcte
    where   eomonth([date]) < @date2
)
select  count(*)
from    rcte
where   datepart(month, [date]) = 1

, или вы можете использовать таблицу подсчета, если у вас есть один

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