Выбор между «прошлым октябрем» и сегодняшним днем

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