#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
, а не avarchar
, применение логики даты было бы намного проще.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