#mysql #date #select
#mysql #Дата #выберите
Вопрос:
все еще новичок, когда дело доходит до запросов SQL. Мне нужно выбрать поля из таблицы с полем даты, например, с 1 октября прошлого года по сегодняшний день.
Что-то вроде
SELECT field FROM table WHERE table.date BETWEEN ***last october*** and CURDATE()
Итак, что я могу добавить вместо прошлого октября, чтобы он работал, не касаясь его снова через год?
Ответ №1:
Я бы проверил, является ли текущий месяц октябрем -> декабрем. В этом случае я могу получить октябрь текущего года, иначе я бы получил октябрь прошлого года :
-- returns <current year>-10-01 if we are in octobre, november or december, else <current year - 1>-10-01
SELECT CONCAT(IF(MONTH(CURDATE()) >= 10, YEAR(CURDATE()), YEAR(CURDATE()) - 1),'-10-01');
SELECT field
FROM table
WHERE table.date BETWEEN
CONCAT(IF(MONTH(CURDATE()) >= 10, YEAR(CURDATE()), YEAR(CURDATE()) - 1),'-10-01')
and
CURDATE()
Ответ №2:
Вам нужно выполнить пару подзапросов:
а) Текущий месяц:
mysql> select month(now());
--------------
| month(now()) |
--------------
| 11 |
--------------
б) Получите год сравнения, например, если прошло 1 октября этого года, затем верните текущий год, в противном случае предыдущий год:
mysql> select case when month(now()) >= 10 then year(now()) else year(now()) - 1 end;
------------------------------------------------------------------------
| case when month(now()) >= 10 then year(now()) else year(now()) - 1 end |
------------------------------------------------------------------------
| 2020 |
------------------------------------------------------------------------
c) создайте дату для последнего 1 октября:
mysql> select concat(case when month(now()) >= 10 then year(now()) else year(now()) - 1 end, '-10-01');
------------------------------------------------------------------------------------------
| concat(case when month(now()) >= 10 then year(now()) else year(now()) - 1 end, '-10-01') |
------------------------------------------------------------------------------------------
| 2020-10-01 |
------------------------------------------------------------------------------------------
Последний запрос является заменой для прошлого октября
Поэтому окончательный запрос:
SELECT field FROM table WHERE table.date BETWEEN CONCAT(CASE WHEN MONTH(NOW()) >= 10 THEN YEAR(NOW()) ELSE YEAR(NOW()) - 1 END, '-10-01') AND DATE(NOW())