Now () ile current_timestamp arasındaki fark


45

PostgreSQL'de now()ve current_timestampfonksiyonunu kullanıyorum ve hiçbir fark görmüyorum:

# SELECT now(), current_timestamp;
              now               |              now               
--------------------------------+--------------------------------
 04/20/2014 19:44:27.215557 EDT | 04/20/2014 19:44:27.215557 EDT
(1 row)

Bir şey mi eksik?

Yanıtlar:


54

Arada fark yok. Kılavuzdan üç alıntı:

1)

Bu SQL standardı, geçerli işlemin başlangıç ​​zamanını temel alarak tüm değerleri döndürür:
... ...
CURRENT_TIMESTAMP

2)

transaction_timestamp()eşittir CURRENT_TIMESTAMP, ancak geri döndüğü şeyi açıkça yansıtması için adlandırılır.

3)

now()geleneksel bir PostgreSQL'e eşittir transaction_timestamp().

Cesur vurgu benim. CURRENT_TIMESTAMP, transaction_timestamp()Ve now()bunu tam olarak aynı. CURRENT_TIMESTAMPBir işlev için izleyen parantez çifti olmayan, sözdizimsel bir tuhaflıktır. Bu, SQL standardına göre.

Bir SQL deyiminde bir işlev çağrısı için bir sütun diğer adı bildirmezseniz, diğer ad varsayılan olarak işlev adına ayarlanır. Dahili olarak standart SQL CURRENT_TIMESTAMPile uygulanır now(). "Şimdi" olan, ancak Postgres 10'da "current_timestamp" olarak değiştirilen , sonuçta elde edilen sütun adını gösteren Postgres 9.6'ya kadar .

transaction_timestamp() aynısını yapar, ancak bu uygun bir Postgres işlevidir, bu nedenle varsayılan takma ad her zaman "işlem_timestamp" olmuştur.

Do not ya bunlardan şaşırtmak fonksiyonları özel ile giriş sabiti'now' . Bu , kılavuzdan alıntı yaparak, belirli tarih / saat / zaman damgası değerleri için kullanılan noter kısıtlarından sadece biri :

... okunduğunda sıradan tarih / saat değerlerine dönüştürülecek. (Özellikle nowve ilgili dizeler, okundukları anda belirli bir zaman değerine dönüştürülür.) Bu komutların hepsinin, SQL komutlarında sabit olarak kullanıldığında tek tırnak içine alınması gerekir.

Bu karışıklığa ek olarak (en az Postgres 12'ye kadar) herhangi bir sayıda ön ve arka boşluk ve braketin ( {[( )]}) bu özel girdi değerlerinden kesilmiş olduğunu ekleyebilir . Öyleyse 'now()'::timestamptz- veya sadece 'now()'açık bir tip döküm gerektirmediğinde - de geçerlidir ve now() çoğu bağlamdaki işlevle aynı zaman damgasını değerlendirir . Ancak bunlar sabittir ve genellikle örneğin sütun varsayılanı olarak istediğinizi değil .

db <> burada keman
Eski SQL keman

Önemli alternatifler statement_timestamp()ve clock_timestamp(). Kullanım kılavuzu:

statement_timestamp()Geçerli ifadenin başlangıç ​​zamanını döndürür (daha özel olarak istemciden en son komut mesajının alındığı zamanı). [...]
clock_timestamp()gerçek geçerli zamanı döndürür ve bu nedenle değeri, tek bir SQL komutunda bile değişir.

Not: statement_timestamp()olduğu STABLE, yukarıda (her zaman aynı SQL komut içinde aynı değeri verir) olarak hazırlanmıştır. Ama clock_timestamp()mutlaka sadece VOLATILE. Fark önemli olabilir.


Ancak, sorgu optimizasyonu için bir fark yaratıyor mu? şimdi () her satır için çalıştırılacak where items.createddate > now()mı?
santiago arizti

3
@ santiagoarizti: Hayır now(), STABLEaynı işlem içinde aynı değeri (geçerli işlemin başlama saatini) değerlendirdiği için tanımlandı . Ben sizin örneğiniz, sadece bir kerenow() uygulanır ( örneğin, aksine ). clock_timestamp()
Erwin Brandstetter

3

Ayrıca, doğru kullandığınızda fonksiyonel olarak hiçbir farkları yoktur, farklı şekilde kullanılırlar:

'now()'recongnized (tıpkı 'today'veya benzeri 'now'):

b=# select 'now()'::timestamptz;
          timestamptz
-------------------------------
 2016-12-09 16:31:35.942243+00
(1 row)

'CURRENT_TIMESTAMP'karanlık kenarlardan komik hatalar veriyor

Not: PostgreSQL sürüm 7.2'den itibaren, 'current' artık tarih / saat sabiti olarak desteklenmiyor

b=# select 'CURRENT_TIMESTAMP'::timestamptz;
ERROR:  date/time value "current" is no longer supported
LINE 1: select 'CURRENT_TIMESTAMP'::timestamptz;
               ^

ve 'transaction_timestamp()'sadece tz değerine sahip zaman damgası olarak tanımlanmadı:

b=# select 'transaction_timestamp()'::timestamptz;
ERROR:  invalid input syntax for type timestamp with time zone: "transaction_timestamp()"
LINE 1: select 'transaction_timestamp()'::timestamptz;
               ^

Lütfen neden böyle davrandığını sorma 'now()' as timestamp. İnsanların kodunda where timestamp_column = 'now()'değil de gördüm where timestamp_column = now(), bu açıklamanın Erwin'in cevabına komik bir gerçek ve iyi bir katkı olacağını düşündüm.


Bu bir yanlış anlama. Giriş dizesi'now()' işlevine benzer now()yüzey üzerinde, ancak doğrudan aksi ilgili değildir. mevcut işlemin başlangıç ​​zamanını'now' değerlendiren bir sabittir . Sondaki parens göz ardı edilir. İpleri fırlatma veya benzer şekilde kullanma girişimi başarısız olur, çünkü bu sadece saçmalık. İkisi de ilgili fonksiyonlarla ilişkili değildir. 'CURRENT_TIMESTAMP''transaction_timestamp()'timestamp
Erwin Brandstetter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.