#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)
)