MySQL DATETIME вопрос - PullRequest
       18

MySQL DATETIME вопрос

1 голос
/ 27 декабря 2008

У меня есть поле DATETIME. Я хотел бы выбрать все записи, которые были обновлены за последнюю неделю. Прямо сейчас я использую этот запрос:

SELECT SUM(mins_spent) as time_sum FROM todos WHERE 
lastUpdate >= '2008-12-22' AND lastUpdate <='2008-12-28' 

Но результаты, которые я получаю, кажутся разными в зависимости от времени суток, например, в 7 часов вечера я могу получить 17 часов, а в 11 часов - 14 часов, хотя он должен увеличиваться, а не уменьшаться. Я думал об изменении запроса на:

SELECT SUM(mins_spent) as time_sum FROM todos WHERE 
lastUpdate >= '2008-12-22 00:00:00' AND lastUpdate <='2008-12-28 00:00:00'

Поможет ли это вообще? Предложения, пожалуйста ..

Ответы [ 2 ]

5 голосов
/ 27 декабря 2008

'2008-12-22' должно равняться '2008-12-22 00:00:00'.

Вы хотите "до конца 28-го дня?" Если это так, добавьте 23:59:59 ко второй дате.
Кроме того, вы можете использовать lastUpdate < "2008-12-29".

Как вы отслеживаете изменения в существующей задаче? INSERT и / или DELETE? Или UPDATE?

Если вы DELETE делаете записи после «завершения», у вас будет меньше записей.

Если вы UPDATE ', разрешаете ли вы изменять даты за пределы текущей недели? Если это так, они будут удалены из ваших результатов.

Чтобы увидеть, что происходит, вы можете попробовать собрать несколько агрегатов в таблице, mins_spent и lastUpdate (отметьте значения и периодически запускайте, чтобы увидеть, как они меняются).

SELECT count(*) AS Total
FROM todos
WHERE lastUpdate >= '2008-12-22' AND lastUpdate <= '2008-12-28 23:59:59'

SELECT min(mins_spent) AS Min, max(mins_spent) AS Max, avg(mins_spent) AS Avg
FROM todos
WHERE lastUpdate >= '2008-12-22' AND lastUpdate <= '2008-12-28 23:59:59'

SELECT min(lastUpdate) AS Min, max(lastUpdate) AS Max
FROM todos
WHERE lastUpdate >= '2008-12-22' AND lastUpdate <= '2008-12-28 23:59:59'
1 голос
/ 27 декабря 2008

Судя по справочному руководству по MySQL 6.0 для Типы даты и времени , вы должны быть более или менее в порядке, как написано. Однако, если это действительно не работает, возможно, вы обнаружили ошибку, о которой нужно сообщить.

Значение DATE приводится к типу DATETIME путем добавления временной части как «00: 00: 00». Чтобы выполнить сравнение, игнорируя вместо этого временную часть значения DATETIME, используйте функцию CAST (), чтобы выполнить сравнение следующим образом:

date_col = CAST(NOW() as DATE);

В ваших запросах говорится '<=' 2008-12-28 '; это должно быть строго меньше, не меньше или равно. </p>

Один очень тонкий момент был бы: обрабатываются ли написанные вами выражения как DATETIME (потому что LHS является столбцом DATETIME) или как DATE (потому что RHS лучше всего обрабатывается как DATE), или, действительно, DATETIME преобразовать в строку, соответствующую RHS? Было бы важно, если бы LHS конвертировался в ДАТУ, потому что любое время 28-го числа будет в диапазоне, тогда как вы, кажется, хотите все с 21-го по 27-е. Что произойдет, если вы явно исправите типы с помощью приведений?

Кроме того, сервер MySQL работает в том же часовом поясе, что и вы? Казалось, что между тем, что вы видели, и номинальным концом дня была разница между часами? Я до сих пор не уверен, как именно это может (неправильно) работать, но это может быть иным неучтенным фактором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...