Когато връщате текущата дата/час в MySQL, има набор от функции, от които можете да избирате. Повечето от тях са просто синоними на друга функция.
Има обаче две функции, които изглежда правят едно и също нещо, но всъщност са малко по-различни. Функциите, за които имам предвид, са SYSDATE() и NOW() .
Разликата между SYSDATE() и NOW()
И двете функции връщат текущата дата и час. Ето къде обаче те се различават:
SYSDATE()връща времето, в което се изпълнява.NOW()връща постоянно време, което указва времето, в което изявлението започна да се изпълнява.SET TIMESTAMPоператор засяга стойността, върната отNOW()но не и отSYSDATE().
Така че в много случаи вероятно ще получите същия резултат, независимо коя функция използвате. Ако обаче изявлението ви е по-сложно и отнема известно време, за да се изпълни, може да получите доста голяма разлика в връщаната стойност в зависимост от това коя функция използвате.
Пример
Ето пример, за да демонстрирате как връщаната стойност може да варира в зависимост от това коя функция използвате.
SELECT
SYSDATE(), SLEEP(10) AS '', SYSDATE(),
NOW(), SLEEP(10) AS '', NOW();
Резултат:
+---------------------+---+---------------------+---------------------+---+---------------------+ | SYSDATE() | | SYSDATE() | NOW() | | NOW() | +---------------------+---+---------------------+---------------------+---+---------------------+ | 2018-06-23 11:55:26 | 0 | 2018-06-23 11:55:36 | 2018-06-23 11:55:26 | 0 | 2018-06-23 11:55:26 | +---------------------+---+---------------------+---------------------+---+---------------------+
Така че в този пример изпълнявам SYSDATE() два пъти, но с пауза от 10 секунди между тях. След това правя същото с NOW() .
Както се очакваше, 10-секундната пауза засяга връщаната стойност на втория SYSDATE() но не и вторият NOW() . Всъщност стойностите и за двата екземпляра на NOW() са същите като за първия екземпляр на SYSDATE() , когато изявлението започна да се изпълнява.
Превръщане на SYSDATE() в псевдоним за NOW()
Ако разликата между тези две функции ви създава проблеми, всъщност имате възможност да направите SYSDATE() псевдоним за NOW() .
За да направите това, използвайте --sysdate-is-now опция за сървърна команда. За повече информация вижте –sysdate-is-now на уебсайта за документация на MySQL.