Имеются такие функции, как NOW()
, CURRENT_TIMESTAMP()
и CURRENT_DATE()
.Для чего-либо еще, например LAST_WEDNESDAY()
, вы можете написать свои собственные хранимые функции .
create function last_wednesday() returns date no sql
return current_date() - interval (weekday(current_date()) + 4)%7+1 day;
или использовать то же выражение, встроенное в ваши запросы.
Update
По просьбе Strawberry - вот что-то «более масштабируемое»:
create function human_to_date(str text, date date) returns date no sql
return case
when str = 'last monday' then date - interval (weekday(date) + 6-0)%7+1 day
when str = 'last tuesday' then date - interval (weekday(date) + 6-1)%7+1 day
when str = 'last wednesday' then date - interval (weekday(date) + 6-2)%7+1 day
when str = 'last thursday' then date - interval (weekday(date) + 6-3)%7+1 day
when str = 'last friday' then date - interval (weekday(date) + 6-4)%7+1 day
when str = 'last saturday' then date - interval (weekday(date) + 6-5)%7+1 day
when str = 'last sunday' then date - interval (weekday(date) + 6-6)%7+1 day
end
;
Используйте его как
select human_to_date('last wednesday', now())
или для любой даты в качестве ссылки
select human_to_date('last sunday', '2019-10-01')
Это вернет последнее воскресенье в этом месяце (сентябрь 2019)
См. demo
Я пытался удалить дублирование кода, но закончил так:
delimiter //
create function human_to_date(str text, date date) returns date no sql
begin
declare day_of_week int default null;
if str rlike '^last (monday|tuesday|wednesday|thursday|friday|saturday|sunday)$' then
set day_of_week = case substring_index(str, ' ', -1)
when 'monday' then 0
when 'tuesday' then 1
when 'wednesday' then 2
when 'thursday' then 3
when 'friday' then 4
when 'saturday' then 5
when 'sunday' then 6
end;
return date - interval (weekday(date) + 6-day_of_week)%7+1 day;
end if;
return null;
end //
delimiter ;
db-fiddle