MySQL
Операции даты и времени
Поиск…
Сейчас()
Select Now();
Показывает текущую дату и время сервера.
Update `footable` set mydatefield = Now();
Это обновит поле mydatefield
с текущей датой и временем сервера в настроенном часовом поясе сервера, например
'2016-07-21 12:00:00'
Арифметика даты
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Покажите вопросы mysql, которые были заданы от 3 до 10 часов назад (от 180 до 600 минут назад):
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
Страницы руководства MySQL для TIMESTAMPDIFF()
.
Остерегайтесь Не пытайтесь использовать выражения типа CURDATE() + 1
для арифметики даты в MySQL. Они не возвращают то, что вы ожидаете, особенно если вы привыкли к продукту базы данных Oracle. CURDATE() + INTERVAL 1 DAY
используйте CURDATE() + INTERVAL 1 DAY
.
Тестирование по диапазону дат
Хотя очень заманчиво использовать BETWEEN
... AND
... для диапазона дат, это проблематично. Вместо этого этот шаблон позволяет избежать большинства проблем:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
Преимущества:
-
BETWEEN
является «включенным», таким образом, включая окончательную дату или вторую. -
23:59:59
неудобно и неправильно, если у вас разрешение на микросекунду наDATETIME
. - Этот шаблон избегает использования високосных лет и других расчетов данных.
- Он работает, является ли
x
DATE
,DATETIME
илиTIMESTAMP
.
SYSDATE (), NOW (), CURDATE ()
SELECT SYSDATE();
Эта функция возвращает текущую дату и время как значение в 'YYYY-MM-DD HH:MM:SS'
или YYYYMMDDHHMMSS
, в зависимости от того, используется ли функция в строковом или числовом контексте. Он возвращает дату и время в текущем часовом поясе.
SELECT NOW();
Эта функция является синонимом SYSDATE()
.
SELECT CURDATE();
Эта функция возвращает текущую дату без какого-либо времени в качестве значения в 'YYYY-MM-DD'
или YYYYMMDD
зависимости от того, используется ли эта функция в строковом или числовом контексте. Он возвращает дату в текущем часовом поясе.
Извлечь дату из заданной даты или выражения DateTime
SELECT DATE('2003-12-31 01:02:03');
Выход будет:
2003-12-31
Использование индекса для поиска по дате и времени
Многие таблицы базы данных реального мира имеют много строк с значениями столбца DATETIME
или TIMESTAMP
охватывающими много времени, включая годы или даже десятилетия. Часто необходимо использовать предложение WHERE
для получения некоторого подмножества этого промежутка времени. Например, мы можем захотеть извлечь строки из таблицы с датой 1 сентября-2016.
Неэффективный способ сделать это:
WHERE DATE(x) = '2016-09-01' /* slow! */
Он неэффективен, потому что он применяет функцию - DATE()
- к значениям столбца. Это означает, что MySQL должен проверять каждое значение x
, и индекс не может использоваться.
Лучшим способом выполнения операции является
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Это выбирает диапазон значений x
лежащих где-нибудь в рассматриваемый день, вплоть до, но не включая (следовательно <
) полночь на следующий день.
Если таблица имеет индекс в столбце x
, то сервер базы данных может выполнять сканирование диапазона по индексу. Это означает, что он может быстро найти первое соответствующее значение x, а затем последовательно сканировать индекс, пока не найдет последнее соответствующее значение. Сканирование диапазона индекса намного более эффективно, чем полное сканирование таблицы, которое требуется DATE(x) = '2016-09-01
.
Не искушайтесь использовать это, хотя он выглядит более эффективным.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Он имеет ту же эффективность, что и сканирование диапазона, но он будет выбирать строки со значениями x
падающими точно в полночь 2 сентября 2016 года, чего вы не хотите.