Как создать таблицу диапазона дат (день, неделя, месяц)

#sql #sql-server #datetime

#sql #sql-сервер #дата и время

Вопрос:

У меня вопрос о таблице datetime в SQL Server.

Это мой код. Я могу создавать ежедневные

 SELECT DAYDATE AS BASE_DT

FROM(
        SELECT CONVERT(CHAR(10), DATEADD(D, NUMBER, '2019-01-01'), 120) AS DAYDATE    
        FROM MASTER..SPT_VALUES WITH(NOLOCK)
        WHERE TYPE = 'P'
        AND NUMBER <= DATEDIFF(D, '2019-01-01', getdate())
) DATE_TABLE
 

Я могу создать ежедневный столбец, но я не знаю, как добавить столбец недели, месяца

Вот так.

введите описание изображения здесь

Пожалуйста, проверьте эту проблему. Спасибо.

Комментарии:

1. WEEK_DT всегда ли воскресенье?

2. Если бы вы вернули дату как a date , а не a varchar , применение логики даты было бы намного проще.

3. @GiorgosBetsos Да, правильно.

4. Прекратите разбрызгивать свой код с помощью nolock . Простой поиск позволит найти МНОГО примеров создания таблицы / календаря даты (не даты и времени), подобных этому .

Ответ №1:

Вы можете использовать следующий запрос:

 SET DATEFIRST 1;  -- Set first day of week to Monday

SELECT 
 DAYDATE AS BASE_DT 

 -- last day (always a Sunday) of the current week
 , CONVERT(DATE, DATEADD(D, 7 - DATEPART(WEEKDAY, DAYDATE), DAYDATE)) AS WEEK_DT 

 -- last day of the current month
 , CONVERT(DATE, DATEADD(month, ((YEAR(DAYDATE) - 1900) * 12) 
                                       MONTH(DAYDATE), -1)) AS MONTH_DT  
FROM (
   SELECT CONVERT(DATE, DATEADD(D, NUMBER, '2019-01-01')) AS DAYDATE    
   FROM MASTER..SPT_VALUES WITH(NOLOCK)
   WHERE TYPE = 'P'
          AND NUMBER <= DATEDIFF(D, '2019-01-01', getdate())
) DATE_TABLE
 

Вывод:

 BASE_DT     WEEK_DT     MONTH_DT
----------------------------------
2019-01-01  2019-01-06  2019-01-31
2019-01-02  2019-01-06  2019-01-31
2019-01-03  2019-01-06  2019-01-31
2019-01-04  2019-01-06  2019-01-31
...
2019-02-01  2019-02-03  2019-02-28
2019-02-02  2019-02-03  2019-02-28
2019-02-03  2019-02-03  2019-02-28
...
2021-01-09  2021-01-10  2021-01-31
2021-01-10  2021-01-10  2021-01-31
2021-01-11  2021-01-17  2021-01-31
 

Ответ №2:

Используйте DATEADD и DATEPART, например:

 with d as
(
    SELECT CONVERT(CHAR(10), DATEADD(D, NUMBER, '2019-01-01'), 120) AS DAYDATE    
    FROM MASTER..SPT_VALUES 
    WHERE TYPE = 'P'
    AND NUMBER <= DATEDIFF(D, '2019-01-01', getdate())

)
SELECT DAYDATE AS BASE_DT, 
       dateadd(day,1-datepart(weekday, daydate),daydate) WEEK_DT,
       dateadd(day,1-datepart(day, daydate),daydate) MONTH_DT
FROM d