Как добавить автономный месяц в автономный год в SQL? - PullRequest
0 голосов
/ 04 июня 2019

Мне нужно, чтобы скрипт SQL возвращал тот же день и месяц, но разные с разными годами для каждого года.

Я пытался использовать DATEADD, чтобы добавить месяц и день к отдельному годув форме YEAR(GETDATE()).

SELECT DATEADD(MM, 4, DATEADD(DD, 1, YEAR(GETDATE())))

Когда я запускаю это, он возвращает 1905-11-14 00:00:00.000, даже когда я заменяю GETDATE() на фактическую дату, DATEADD() определенноработает так же, как и когда я изменяю числа внутри них, выход изменяется соответственно.

- Правка -

Требуемый вывод, который мне нужен, - это чтобы месяц и день постоянно оставались на мм= 04 и dd = 01, однако мне нужно, чтобы год был равен текущему году, в котором он выполняется.

В общем, так:

(текущий год) -04-01

Ответы [ 4 ]

0 голосов
/ 05 июня 2019

Я понял, как это сделать,

Я взял прошлый год, '1900-01-01', и они просто сделали DATEDIFF (), чтобы вернуть количество лет с этой даты:

DATEDIFF(YY, '1900-04-01', GETDATE())

Используя это, я мог бы затем добавить результат к постоянному году «1900» плюс желаемый постоянный месяц (04) и день (01) (так что «1900-04-01») для полученияМой желаемый результат, это легко сделать, поместив константу в оператор DATEADD () с оператором DATEDIFF (), приведенным выше:

SELECT DATEADD(YY, DATEDIFF(YY, '1900-04-01', GETDATE()), '1900-04-01')

. Затем получается результат:

2019-04-01 00:00:00.000

Где 2019 - текущий год, в котором выполняется скрипт, созданный оператором GETDATE (), а 04-01 - желаемый месяц и день, в которые выходные данные всегда должны быть.

0 голосов
/ 04 июня 2019

Если вы пытаетесь добавить 4 месяца и 1 день в GetDate (), попробуйте это:

выберите DATEADD (MM, 4, DATEADD (DD, 1, GETDATE ()))

0 голосов
/ 04 июня 2019

Причина, по которой вы получаете вывод, заключается в том, что DATEADD интерпретирует целые числа.

Третий аргумент для DATEADD должен быть полной датой, но, как написано, он извлекает значение YEAR GETDATE(), которое в настоящее время равно 2019. DATEADD рассматривает это число как две тысячи идевятнадцать дней с «дня 0».День 0 под капотом - 1900-01-01 00:00:00.000, а через 2019 дней - 1905-07-13 00:00:00.000.Ваш внутренний DATEADD добавляет один день к этому, чтобы перенести вас на 14 июля, а затем ваш внешний DATEADD добавляет четыре месяца, в результате чего вы видите 1905-11-14 00:00:00.000.

Есливсе, что вас интересует, это смена года, вы можете просто использовать:

SELECT DATEADD(YEAR,<Whatever your offset value or values are>,GETDATE());

Чтобы получить, скажем, следующие пять лет:

SELECT DATEADD(YEAR,X,GETDATE()) AS NextFive
FROM
  (VALUES (1),(2),(3),(4),(5)) AS y(X);

Результаты:

+-------------------------+
|        NextFive         |
+-------------------------+
| 2020-06-04 14:07:56.800 |
| 2021-06-04 14:07:56.800 |
| 2022-06-04 14:07:56.800 |
| 2023-06-04 14:07:56.800 |
| 2024-06-04 14:07:56.800 |
+-------------------------+
0 голосов
/ 04 июня 2019

Если вы используете SQL Server, вы можете использовать datefromparts():

select datefromparts(1950, month(getdate()), day(getdate())

или добавьте количество лет текущего года:

select dateadd(year, -4, convert(date, getdate()))

Они могут немного отличаться для високосных дней, но вам нужно будет указать, что вы хотите в этот день.

...