Конкретная дата с current_month и previous_month - PullRequest
0 голосов
/ 25 сентября 2018

Можно ли сделать год и месяц частью даты динамическим (на основе текущего года и месяца) вместо жесткого кодирования?

SELECT SUM(`amount`)
FROM employees 
WHERE (`date` between "2018-08-26" and "2018-09-26") AND `status` = 'Pending';

В приведенном выше примере, если текущий месяц равен 9, тогда запрос должен быть 08-26 и 09-26, если текущий месяц 10, 09-26 и 10-26 и т. Д.

Ответы [ 5 ]

0 голосов
/ 25 сентября 2018

Вот как вы можете построить нужные даты:

SELECT 
    CURRENT_DATE,
    STR_TO_DATE(CONCAT_WS('-', YEAR(CURRENT_DATE), MONTH(CURRENT_DATE), 26), '%Y-%m-%d'),
    STR_TO_DATE(CONCAT_WS('-', YEAR(CURRENT_DATE), MONTH(CURRENT_DATE), 26), '%Y-%m-%d') - INTERVAL 1 MONTH
-- 2018-09-25 | 2018-09-26 | 2018-08-26

И использовать вышеперечисленное в своем запросе:

SELECT SUM(`amount`)
FROM employees 
WHERE `date` BETWEEN
    STR_TO_DATE(CONCAT_WS('-', YEAR(CURRENT_DATE), MONTH(CURRENT_DATE), 26), '%Y-%m-%d') - INTERVAL 1 MONTH AND
    STR_TO_DATE(CONCAT_WS('-', YEAR(CURRENT_DATE), MONTH(CURRENT_DATE), 26), '%Y-%m-%d')
AND `status` = 'Pending';
0 голосов
/ 25 сентября 2018

Вместо необработанного запроса вы можете использовать процедуру, в которой он будет динамически создавать дату на основе предоставленной вами даты.

DELIMITER $$

- Вызов Get_Sum (15) - Динамически выпередать дату

ПРОЦЕДУРА ОТМЕНЫ, ЕСЛИ СУЩЕСТВУЕТ Get_Sum $$

DELIMITER;

DELIMITER $$

-

- Создатьпроцедура "Get_Sum"

CREATE DEFINER = 'root' @ 'localhost' ПРОЦЕДУРА Get_Sum (IN Day SMALLINT) BEGIN

Объявить current_month datetime;Объявить предыдущий_месяц datetime;

Выбрать STR_TO_DATE (CONCAT (год (сейчас ()), '-', месяц (NOW ()), '-', день), '% Y-% m-% d') INTO current_month;

Выберите DATE_SUB (current_month, INTERVAL 1 MONTH) в previous_month;

ВЫБЕРИТЕ СУММУ (amount) ОТ ГДЕ ГДЕ (date между предыдущим_месяцем и текущим_месяцем) И status = 'В ожидании';

КОНЕЦ $$

РАЗДЕЛИТЕЛЬ;

0 голосов
/ 25 сентября 2018

Если вы хотите запросить данные за последний месяц, достаточно использовать такой запрос:

SELECT * FROM my_table
WHERE some_datetime_column > DATE_ADD(NOW(), INTERVAL -1 MONTH);

Также, если вы хотите получить текущий месяц / год, попробуйте это:

SELECT MONTH(NOW()), YEAR(NOW())

Демонстрация

ОБНОВЛЕНИЕ

Попробуйте это:

--here you specify the day of the month you want
SELECT @days := 26 - DAY(NOW());
SELECT @startDate := DATE_ADD(CAST(NOW() AS DATE), INTERVAL @days DAY),
       @endDate := DATE_ADD(DATE_ADD(CAST(NOW() AS DATE), INTERVAL @days DAY), INTERVAL -1 MONTH)

Еще одна демонстрация

Тогда вы можете использовать его как:

SELECT * FROM t
WHERE date_column BETWEEN @startDate AND @endDate
0 голосов
/ 25 сентября 2018

Для получения текущего месяца используйте

MONTH(NOW())

Для получения текущего года используйте

YEAR(NOW())

Но вам не нужны эти

Используйте это-

SELECT SUM(`amount`) FROM employees 
WHERE (`date` between DATE_ADD(CURDATE(), INTERVAL -1 MONTH) and CURDATE()) 
AND `status` = 'Pending';

Используйте CURDATE (), чтобы получить текущую дату.

Чтобы получить ту же дату, что и в предыдущем месяце, используйте:

 DATE_ADD(CURDATE(), INTERVAL -1 MONTH)

По состоянию на 25/9/2018

SELECT CURDATE()

Вывод:

2018-09-25

За предыдущий месяц

SELECT DATE_ADD(CURDATE(), INTERVAL -1 MONTH)

Вывод:

2018-08-25
0 голосов
/ 25 сентября 2018

Попробуйте ниже с now () и прошлым месяцем (DATE_SUB (NOW (), INTERVAL 1 MONTH)):

SELECT SUM(`amount`) FROM employees 
WHERE (`date` between DATE_SUB(NOW(), INTERVAL 1 MONTH) and now())
AND `status` = 'Pending';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...