Podczas zwracania bieżącej daty/godziny w MySQL masz do wyboru szereg funkcji. Większość z nich to po prostu synonimy innej funkcji.
Istnieją jednak dwie funkcje, które wydają się robić to samo, ale w rzeczywistości są nieco inne. Funkcje, o których mówię, to SYSDATE()
i NOW()
.
Różnica między SYSDATE() a NOW()
Obie funkcje zwracają bieżącą datę i godzinę. Jednak oto, gdzie się różnią:
SYSDATE()
zwraca czas wykonania.NOW()
zwraca stały czas, który wskazuje czas, w którym instrukcja zaczął wykonywać.SET TIMESTAMP
instrukcja wpływa na wartość zwracaną przezNOW()
ale nie przezSYSDATE()
.
W wielu przypadkach prawdopodobnie uzyskasz ten sam wynik, niezależnie od używanej funkcji. Jednakże, jeśli Twoja instrukcja jest bardziej złożona i jej wykonanie zajmuje trochę czasu, możesz otrzymać dość dużą różnicę w wartości zwracanej w zależności od używanej funkcji.
Przykład
Oto przykład pokazujący, jak wartość zwracana może się różnić w zależności od używanej funkcji.
SELECT SYSDATE(), SLEEP(10) AS '', SYSDATE(), NOW(), SLEEP(10) AS '', NOW();
Wynik:
+---------------------+---+---------------------+---------------------+---+---------------------+ | 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 | +---------------------+---+---------------------+---------------------+---+---------------------+
W tym przykładzie uruchamiam SYSDATE()
dwa razy, ale z 10-sekundową przerwą pomiędzy nimi. Następnie robię to samo z NOW()
.
Zgodnie z oczekiwaniami, 10-sekundowa pauza wpływa na wartość zwracaną przez drugą SYSDATE()
ale nie drugi NOW()
. W rzeczywistości wartości obu wystąpień funkcji NOW()
są takie same jak w przypadku pierwszego wystąpienia SYSDATE()
, czyli wtedy, gdy instrukcja zaczęła działać.
Uczynienie SYSDATE() aliasem dla NOW()
Jeśli różnica między tymi dwiema funkcjami powoduje problemy, faktycznie masz możliwość wykonania SYSDATE()
alias dla NOW()
.
Aby to zrobić, użyj --sysdate-is-now
opcja polecenia serwera. Aby uzyskać więcej informacji, zobacz –sysdate-is-now na stronie dokumentacji MySQL.