Когато връщате текущата дата/час в 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.