Как использовать вычисленное значение в DATEFROMPARTS в SQL - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно вычисленное значение месяца в функции DATEFROMPARTS. Месяц должен быть за семь месяцев до месяца CURRENT_TIMESTAMP.

Вот что я пробовал:

DATEFROMPARTS (Год (CURRENT_TIMESTAMP), Месяц (CURRENT_TIMESTAMP) -7, 1) как SevenMoAgo;

I will eventually use this in the following expression where '12-01-2018' is:

where RECORDED_SERVICE_STARTTIME > ='12-01-2018'

I later used

declare @CurMo AS INT;
declare @MonPri7 AS INT;
set @CurMo = Month(CURRENT_TIMESTAMP);
set @MonPri7 = (@CurMo -7);
Datefromparts(Year(CURRENT_TIMESTAMP), @MonPri7, 1) as SevenMoAgo;

Это тоже не сработало.

Я получаю следующее сообщение об ошибке:

"Невозможно создать дату типа данных, некоторые аргументы имеют недопустимые значения."

Для второго кода я получаю:

Сообщение 102, Уровень 15, Состояние 1, Строка 8 Неверный синтаксис рядом с DateFromparts.

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Попробуйте это ...

SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP) - 7, 0)

Позвольте мне объяснить. Прежде всего, мы должны понимать, что SQL Server интерпретирует 0 как 1900-01-01 , как показано следующими функциями DATEPART.

SELECT DATEPART(YEAR, 0)  AS Year
     , DATEPART(MONTH, 0) AS Month
     , DATEPART(DAY, 0)   AS Day;

Что возвращает ...

Year        Month       Day
----------- ----------- -----------
1900        1           1

Следовательно, мой SQL можно переписать как ...

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '1900-01-01', CURRENT_TIMESTAMP) - 7, '1900-01-01')

Теперь, возможно, немного легче увидеть, что здесь происходит. Функция DATEDIFF возвращает количество месяцев между 1900-01-01 и сегодняшним днем ​​(CURRENT_TIMESTAMP), которое составляет 1434.

SELECT DATEADD(MONTH, 1434 - 7, '1900-01-01')

Затем мы вычитаем 7 из 1434, то есть 1427, и добавляем это много месяцев назад к 1900-01-01.

SELECT DATEADD(MONTH, 1427, '1900-01-01')

Что дает 2018-12-01.

0 голосов
/ 09 июля 2019

Причина: @MonPri7 is equal to ZERO when you say (@CurMo -7)

Существует много разных способов его расчета, но если вы хотите исправить свою логику, вы должны использовать это:

declare @CurMo AS INT;
declare @MonPri7 AS INT;
set @CurMo = Month(CURRENT_TIMESTAMP);
set @MonPri7 = (@CurMo -7);
declare @Y int = Year(CURRENT_TIMESTAMP) -- <-- This is new variable
-- if 7 months ago is ZERO then you should go back to prev year December
if @MonPri7 = 0
begin
  set @MonPri7 = 12
  set @Y = @Y - 1
end

Edit:

declare @SevenMonthsAgo datetime;
select @SevenMonthsAgo = Datefromparts(@Y, @MonPri7, 1);

SELECT yourfields
FROM yourtable
where RECORDED_SERVICE_STARTTIME > = '01-01-2019' and
      RECORDED_SERVICE_STARTTIME > = @SevenMonthsAgo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...