как получить вчерашнюю дату, если дата хранится в формате типа varchar (mm-dd-yyyy) для планировщика событий - PullRequest
0 голосов
/ 12 января 2019

У меня есть таблица с именем time, где дата в столбце даты хранится в формате типа varchar (m-d-y)

Я запускаю мероприятие в 1 час ночи каждую ночь, вставляя данные в ежедневную таблицу данных. в приведенной ниже формуле я указал значение A.Date вчерашнего дня (например, если сегодня (01-12-2019) в 1:00 запускается событие, то следует выбрать дату вчерашнего дня (01-11-2019)

INSERT INTO dailydata 
SELECT A.Date, A.EmpID, B.name, B.TeamName, 
SUM(CASE WHEN State = 'active' THEN A.MinutesatState ELSE 0 END) AS active,
SUM(CASE WHEN State = 'idle' THEN A.MinutesatState ELSE 0 END) AS idle,
Min(A.Statestarttime) AS Stime, MAX(A.StateEndtime) AS Etime,
ROUND((TIME_TO_SEC(MAX(A.StateEndtime))/60 - 
TIME_TO_SEC(MIN(A.StateStarttime))/60)/60,2) as Inofficehr, 
ROUND(SUM(CASE WHEN State = 'active' THEN A.MinutesatState ELSE 0 END)/60,2) 
AS activehr, 
ROUND(SUM(CASE WHEN State = 'idle' THEN A.MinutesatState ELSE 0 END)/60,2) 
AS idlehr 
FROM time A join ttld.login B on A.EmpID=B.username 
WHERE A.Date= subdate(current_date, 1) AND A.Statestarttime <>'' AND A.StateEndtime <>'' 
GROUP BY A.EmpID;

Во время выполнения этого кода я получаю

Предупреждение: # 1292 Неверное значение даты и времени:

код работает нормально, если я изменяю A.Date= subdate(current_date, 1) на A.Date='01-13-2019', но чтобы сделать это событием, мне нужен какой-то способ автоматически получить вчерашнюю дату.

Я пытался

SELECT SUBDATE(NOW(), 1);
SELECT SUBDATE(NOW(), INTERVAL 1 DAY);
SELECT NOW() - INTERVAL 1 DAY;
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Вам потребуется преобразовать строковую дату в тип данных real DATE, прежде чем сравнивать его с другой датой. Для этой цели вы можете использовать STR_TO_DATE.

Попробуйте изменить:

A.Date = subdate(current_date, 1) 

Кому:

STR_TO_DATE(A.Date, '%m-%d-%Y') = SUBDATE(CURRENT_DATE, 1) 
0 голосов
/ 12 января 2019

Я настоятельно рекомендую вам исправить столбец date. Не храните даты в виде строк. Храните их как даты.

Но если да, то я бы порекомендовал сделать сравнение как:

A.Date = DATE_FORMAT(SUBDATE(CURRENT_DATE, 1) , '%m-%d-%Y')

Удалив функции из A.DATE, запрос может использовать индексы.

update time
    set date = str_to_date(date, '%m-%d-%Y');  -- this will set the string to the default format for a date

alter table time modify date date;

Также обратите внимание, что date и time не подходят для имен столбцов и таблиц, поскольку они уже используются как для типов, так и для функций.

0 голосов
/ 12 января 2019

Вы можете использовать это (сначала конвертировать varchar в дату, затем вычесть 1 день из нее)

SELECT DATE_SUB(STR_TO_DATE('01/01/2019', '%m/%d/%y%y%y%y'), INTERVAL 1 DAY)

для использования в предложении where (индексный подход)

Date =  DATE_FORMAT(DATE_SUB(NOW(), interval 1 DAY), '%m-%d-%Y')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...