Поиск…


Сейчас()

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 года, чего вы не хотите.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow