#sql-server #tsql
#sql-server #tsql
Вопрос:
Мне нужно изменить переданную переменную date, если дата попадает под текущий год с 1 ноября по 31 декабря
Как это сделать в TSQL?
Пример:
Пример #1
@ip_batch_date = '2020-12-01T00:00:00'
check @ip_batch_date >=' '2020-11-01T00:00:00' AND @ip_batch_date<='2020-12-31T00:00:00'
Then @ip_batch_date = '2021-01-01T00:00:00'
Пример #2
@ip_batch_date = '2021-11-15T00:00:00'
check @ip_batch_date >='2021-11-01T00:00:00' AND @ip_batch_date<='2021-12-31T00:00:00'
Then @ip_batch_date = '2022-01-01T00:00:00'
Комментарии:
1. является
Nov 1
иDec 31
переменным диапазоном дат или он может быть жестко задан в запросе?
Ответ №1:
Предполагая, что у вас уже есть переданная переменная date с именем @ip_batch_date, я бы использовал что-то вроде
IF (YEAR(@ip_batch_date) = YEAR(GetDate()) AND MONTH(@ip_batch_date) BETWEEN 11 AND 12)
SET @ip_batch_date = DATEFROMPARTS(YEAR(GetDate()) 1,1,1);
Если вместо переданной даты вы писали запрос, который должен был обрабатывать множество строк со столбцом даты в них, которым вы хотели подчинить эту логику, было бы лучше не преобразовывать ip_date_column функцией, а оставить столбец даты пустым и сравнить егок двум сконструированным датам, например:
CASE WHEN my_date_column BETWEEN DATEFROMPARTS(YEAR(GetDate()),11,1)
DATEFROMPARTS(YEAR(GetDate()),12,31)
THEN DATEFROMPARTS(YEAR(GetDate()) 1,1,1);
ELSE my_date_column
END
Наконец, если my_date_column был столбцом datetime или datetime2, а не просто датой, убедитесь, что вместо этого вы используете datetimefromparts или datetime2fromparts , а также добавьте время, чтобы избежать проблем с границей последнего дня
Ответ №2:
Если я правильно понял ваш вопрос:
DECLARE @Date DATETIME
SET @Date = '2020-12-01T00:00:00'
SET @Date = CASE WHEN RIGHT(CONVERT(VARCHAR(8), @Date, 112), 4) >= 1101 THEN DATEADD(yy, DATEDIFF(yy, 0, @Date) 1, 0) ELSE @Date END
SELECT @Date
-- Output : 2021-01-01 00:00:00.000
SET @Date = '2021-12-01T00:00:00'
SET @Date = CASE WHEN RIGHT(CONVERT(VARCHAR(8), @Date, 112), 4) >= 1101 THEN DATEADD(yy, DATEDIFF(yy, 0, @Date) 1, 0) ELSE @Date END
SELECT @Date
-- Output : 2022-01-01 00:00:00.000
Ответ №3:
DECLARE @IP_BATCH_DATE DATETIME= '2020-12-01T00:00:00'
IF @ip_batch_date >= '2020-11-01T00:00:00' AND @ip_batch_date<='2020-12-31T00:00:00'
BEGIN
SELECT datefromparts(YEAR(GETDATE()), 1, 1)
END
ELSE
BEGIN
SELECT @ip_batch_date
END