Инструкция SQL if для диапазона дат

#sql #date #if-statement

Вопрос:

Привет, мне нужна была помощь с синтаксисом, чтобы добавить условие, при котором текущая дата извлекается, если сегодня после 5-го числа каждого месяца, но если она находится между 1-м и 5-м, то она должна извлекать месяц до этого месяца. Это что-то, с чем вы можете помочь, пожалуйста? Ниже показано, как структурирован мой запрос.

  Select * 
 FROM table1  
  left join  table2
       on e.ENTITY_NBR  = d.entity_nbr
     and cast(getdate() as date) between MONTH_BEGIN_DATE and MONTH_END_DATE
 

Комментарии:

1. можете ли вы дать мне фактический результат этого запроса и вывод, который вам нужен?

2. Вы буквально просто хотите включить соответствующую дату (либо сегодня, либо за месяц до сегодняшнего дня, в зависимости от объясненных вами критериев) в возвращаемые столбцы, или вы действительно хотите использовать эту вычисленную дату для какой-либо фильтрации результатов?

3. Какие СУБД вы используете? Когда дело доходит до даты/времени, многие продукты имеют свои собственные функции SQL, отличные от ANSI. Например, getdate()…

4. Что такое MONTH_BEGIN_DATE и MONTH_END_DATE ? Что такое e и d ? Ничто из этого не определено.

Ответ №1:

     Select *,
    CASE WHEN day(GETDATE()) > 5 THEN GETDATE()
    ELSE DATEADD(month,-1,getdate()) END as date
     FROM table1  
      left join  table2
           on e.ENTITY_NBR  = d.entity_nbr
         and cast(getdate() as date) between MONTH_BEGIN_DATE and MONTH_END_DATE
 

Основываясь на расплывчатом описании вашей проблемы, это лучшее, что я могу написать.

Ответ №2:

Если вы просто хотите включить сегодняшнюю дату (или ту же дату с прошлого месяца, если в настоящее время это 5-е или более раннее число текущего месяца), то это можно сделать в вашем SELECT предложении:

 select
    case 
        when datepart(day,getdate()) <= 5 
        then dateadd(month,-1,getdate()) 
        else getdate() 
    end
 

Если вы действительно хотите использовать эту дату для сравнения с каким-либо полем в вашем наборе данных, вы можете включить это же выражение case в свое WHERE предложение.

Комментарии:

1.Не стоит помещать case выражения в предложение WHERE. Лучше использовать обычные И/ИЛИ вместо этого.

2. Это справедливое замечание. Было не совсем ясно, действительно ли задающий вопрос хотел использовать эту расчетную дату в своем WHERE предложении, но вы правы.

Ответ №3:

где извлекается текущая дата, если сегодня после 5-го числа каждого месяца, но если она находится между 1-м и 5-м, то она должна извлекать месяц до этого месяца.

Основываясь на этом описании, вы хотите что-то вроде этого:

 select * 
from table1 e left join
     table2 d
     on e.ENTITY_NBR = d.entity_nbr and
        (day(getdate() > 5 and datediff(month, d.date_col, getdate()) = 0 or
         day(getdate() <= 5 and datediff(month, d.date_col, getdate()) = 1)
        )