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 TIMESTAMPinstrukcja 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.