Возврат всех дней на основе диапазона дат - PullRequest
0 голосов
/ 24 февраля 2020

У меня следующий простой запрос. Что мне нужно сделать, так это показать количество (*) результатов этого запроса за каждый день на основе диапазона дат.

Например, если диапазон дат @StartDate = '01 июля 2019 'и Если выбрано значение @EndDate '01 февраля 2020 года', запрос должен будет отображать результат за каждый день с '01 июля 2019 года' до '01 февраля 2020 года'. Я мог бы подумать только о том, чтобы сделать это с while L oop, но в идеале мне нужен запрос как представление.

Есть идеи?

select count(*) from Data
where
    StartDate <= '31 July 2019' and 
    ([EndDate] >='31 July 2019' or [EndDate] is null)

Я также собрал этот запрос но это не удается:

select 
    DD.Date,
    (
            select count(*) from Data
            where
                StartDate <= DD.Date and 
                ([EndDate] >=DD.Date or [EndDate] is null)
                and 
                Data.StartDate = DD.Date --not sure what to join on given the 2 date fields above
    ) as Count
from 
    DimDate DD
where 
Date >='2019-07-01' and Date <='2020-02-01'

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Одна строка делает это. Это функция DateDiff, которая принимает параметр dd для дней, а также даты начала и окончания.

Вы можете использовать другие параметры, найденные на следующем веб-сайте: https://www.w3schools.com/sql/func_sqlserver_datediff.asp

 select DateDiff(dd, StartDate, EndDate)

выберите dateDiff (dd, cast ('1/1/1991' как дата), приведение («1/1/1990» в качестве даты)) даст вам -365

0 голосов
/ 24 февраля 2020

Я верю, что это сработает для вас. Он плохо работает с большим количеством данных, но я не знаю, сколько у вас данных. Я посмотрю, смогу ли я уточнить это. Или, может, кто-то другой может.

SELECT
            DD.dt
          , x.Count
FROM        DimDate DD
CROSS APPLY (
                SELECT COUNT(*) AS [Count]
                FROM   Data
                WHERE  StartDate <= DD.dt
                       AND (
                               EndDate >= DD.dt
                               OR EndDate IS NULL
                           )
            )                   x
WHERE       DD.dt BETWEEN '2019-07-01' AND '2020-02-01'

Это тоже будет работать (очень близко к тому, что вы имели).

SELECT
            DD.dt
         ,  (
                SELECT COUNT(*) AS [Count]
                FROM   Data
                WHERE  StartDate <= DD.dt
                       AND (
                               EndDate >= DD.dt
                               OR EndDate IS NULL
                           )
            ) AS [Count]
FROM        DimDate DD
WHERE       DD.dt BETWEEN '2019-07-01' AND '2020-02-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...