Når du returnerer den aktuelle dato/tid i MySQL, er der en række funktioner, du kan vælge imellem. De fleste af disse er blot synonymer for en anden funktion.
Der er dog to funktioner, der ser ud til at gøre det samme, men som faktisk er lidt forskellige. De funktioner, jeg henviser til, er SYSDATE()
og NU()
.
Forskellen mellem SYSDATE() og NOW()
Begge funktioner returnerer den aktuelle dato og klokkeslæt. Men her er de forskellige:
SYSDATE()
returnerer det tidspunkt, hvor det udføres.NU()
returnerer et konstant tidspunkt, der angiver det tidspunkt, hvor sætningen begyndte at udføre.INDSTIL TIDSSTYKKE sætning påvirker værdien returneret af NOW()
men ikke efterSYSDATE()
.
Så i mange tilfælde vil du sandsynligvis få det samme resultat, uanset hvilken funktion du bruger. Men hvis din erklæring er mere kompleks og tager et stykke tid at køre, kan du ende med en ret stor forskel i returværdien afhængigt af hvilken funktion du bruger.
Eksempel
Her er et eksempel for at demonstrere, hvordan returværdien kan variere, afhængigt af hvilken funktion du bruger.
SELECT SYSDATE(), SLEEP(10) AS '', SYSDATE(), NOW(), SLEEP(10) AS '', NOW();
Resultat:
+---------------------+---+---------------------+---------------------+---+---------------------+ | 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 | +---------------------+---+---------------------+---------------------+---+---------------------+
Så i dette eksempel kører jeg SYSDATE()
to gange, men med 10 sekunders pause imellem. Jeg gør så det samme med NOW()
.
Som forventet påvirker de 10 sekunders pause returværdien af den anden SYSDATE()
men ikke den anden NOW()
. Faktisk er værdierne for begge forekomster af NOW()
er de samme som for den første forekomst af SYSDATE()
, hvilket er, når sætningen begyndte at køre.
Gør SYSDATE() til et alias for NOW()
Hvis forskellen mellem disse to funktioner giver dig problemer, har du faktisk mulighed for at lave SYSDATE()
et alias for NOW()
.
For at gøre dette skal du bruge --sysdate-is-now
server kommando mulighed. For mere information, se –sysdate-is-now på MySQL-dokumentationswebstedet.