Nie ma różnicy. Trzy cytaty z instrukcji:
1)
Te standardowe funkcje SQL zwracają wszystkie wartości w oparciu o czas rozpoczęcia bieżącej transakcji:
...
...
CURRENT_TIMESTAMP
2)
transaction_timestamp()
jest równoważne CURRENT_TIMESTAMP
, ale ma nazwę, która wyraźnie odzwierciedla to, co zwraca.
3)
now()
jest tradycyjnym odpowiednikiem PostgreSQL transaction_timestamp()
.
Odważny nacisk moje. CURRENT_TIMESTAMP
, transaction_timestamp()
I now()
robić dokładnie to samo. CURRENT_TIMESTAMP
jest składniową osobliwością funkcji, która nie ma końcowej pary nawiasów. Jest to zgodne ze standardem SQL.
Jeśli nie zadeklarujesz aliasu kolumny dla wywołania funkcji w instrukcji SQL, domyślnym aliasem jest nazwa funkcji. Wewnętrznie CURRENT_TIMESTAMP
implementowany jest standardowy SQL now()
. Do Postgres 9.6, który pojawia się w wynikowej nazwie kolumny , która była „teraz”, ale zmieniła się na „current_timestamp” w Postgres 10.
transaction_timestamp()
robi to samo, ale ta jest prawidłową funkcją Postgres, więc domyślnym aliasem zawsze był „znak_transakcji”.
Nie należy mylić żadnej z tych funkcji ze specjalną stałą wejściową'now'
. To tylko jeden z kilku skrótów notacyjnych dla określonych wartości daty / godziny / znacznika czasu, cytując instrukcję:
... które zostaną odczytane podczas odczytu do zwykłych wartości daty / godziny. (W szczególności now
powiązane ciągi znaków są konwertowane na określoną wartość czasu, gdy tylko zostaną odczytane.) Wszystkie te wartości muszą być ujęte w pojedyncze cudzysłowy, gdy są używane jako stałe w poleceniach SQL.
Może to zwiększyć zamieszanie, że (do co najmniej Postgres 12) dowolna liczba początkowych i końcowych spacji i nawiasów ( {[( )]}
) jest przycinana z tych specjalnych wartości wejściowych. Tak więc 'now()'::timestamptz
- lub tylko 'now()'
tam, gdzie nie jest wymagany rzut typu jawnego - jest również poprawny i now()
w większości kontekstów dokonuje oceny według tego samego znacznika czasu co funkcja . Ale są to stałe i zazwyczaj nie są to, na przykład, domyślne kolumny.
db <> skrzypce tutaj
Stare skrzypce SQL
Ważnymi alternatywami są statement_timestamp()
i clock_timestamp()
. Instrukcja:
statement_timestamp()
zwraca czas rozpoczęcia bieżącej instrukcji (dokładniej czas otrzymania ostatniej wiadomości polecenia od klienta). [...]
clock_timestamp()
zwraca aktualny aktualny czas, a zatem jego wartość zmienia się nawet w ramach jednego polecenia SQL.
Uwaga: statement_timestamp()
jest STABLE
jak powyżej (zawsze zwraca tę samą wartość w ramach tego samego polecenia SQL). Ale clock_timestamp()
koniecznie jest tylko VOLATILE
. Różnica może być znacząca.
where items.createddate > now()
:?now()
Zdefiniowano,STABLE
ponieważ ocenia się na tę samą wartość (czas rozpoczęcia bieżącej transakcji) w ramach tej samej transakcji. I twój przykładnow()
jest wykonywany tylko raz (w przeciwieństwie doclock_timestamp()
na przykład).Oprócz tego, że nie mają różnicy funkcjonalnej, gdy używasz ich prawidłowo, są one rzutowane inaczej:
'now()'
rozpoznany (tak jak'today'
lub'now'
):'CURRENT_TIMESTAMP'
daje zabawny błąd z ciemnych krawędzii nie
'transaction_timestamp()'
jest po prostu ponownie interpretowany jako znacznik czasu o wartości tz:Nie pytaj, dlaczego chcesz rzucić
'now()' as timestamp
. Widziałemwhere timestamp_column = 'now()'
zamiastwhere timestamp_column = now()
w kodzie ludzi, więc pomyślałem, że to wyjaśnienie byłoby zabawnym faktem i dobrym dodatkiem do odpowiedzi Erwina.źródło
'now()'
wygląda podobnie do funkcjinow()
na powierzchni, ale nie jest bezpośrednio związane inaczej.'now'
jest stałą oceną czasu rozpoczęcia bieżącej transakcji . Końcowe pareny są ignorowane. Próba oddania ciągi'CURRENT_TIMESTAMP'
lub'transaction_timestamp()'
abytimestamp
w podobny sposób zawiedzie, bo to po prostu bzdura. Żadne z nich nie jest powiązane z odpowiednimi funkcjami.