TSQL: Как изменить дату, если дата попадает между датами текущего года?

#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