PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Postgres now() vs 'sekarang' dalam fungsi

Ini bukan bug, ini fitur... Ada dua poin di sini.

  1. Pergantian 'sekarang'

    Mari kita lihat dokumentasinya (Tanggal /Fungsi dan Operator Waktu ):

    Jadi 'now' dikonversi menjadi stempel waktu pada waktu penguraian.

  2. Pernyataan yang disiapkan

    Oke, tapi apa artinya dalam kaitannya dengan fungsi? Sangat mudah untuk menunjukkan bahwa suatu fungsi ditafsirkan setiap kali Anda memanggilnya:

    t=# create function test() returns timestamp as $$
    begin
     return 'now';
    end;
    $$ language plpgsql;
    CREATE FUNCTION
    
    t=# select test();
               test            
    ----------------------------
     2015-12-11 11:14:43.479809
    (1 row)
    
    t=# select test();
               test            
    ----------------------------
     2015-12-11 11:14:47.350266
    (1 row)
    

    Dalam contoh ini 'now' berperilaku seperti yang Anda harapkan.

    Apa bedanya? Fungsi Anda menggunakan pernyataan SQL, dan test() tidak. Mari kita lihat dokumentasi lagi (PL/ Caching Paket pgSQL ):

    Dan di sini (Siapkan Pernyataan ):

    Oleh karena itu 'now' dikonversi menjadi stempel waktu ketika pernyataan yang disiapkan diuraikan. Mari kita tunjukkan ini dengan membuat pernyataan yang disiapkan di luar fungsi:

    t=# prepare s(integer) as UPDATE test_date_bug SET date2 = 'now' WHERE id = $1;
    PREPARE
    
    t=# execute s(1);
    UPDATE 1
    t=# execute s(2);
    UPDATE 1
    
    t=# select * from test_date_bug;
     id |             date1             |             date2
    ----+-------------------------------+-------------------------------
      3 | 2015-12-11 11:01:38.491656+03 | infinity
      1 | 2015-12-11 11:01:37.91818+03  | 2015-12-11 11:40:44.339623+03
      2 | 2015-12-11 11:01:37.931056+03 | 2015-12-11 11:40:44.339623+03
    (3 rows)
    

Itulah yang terjadi. 'now' dikonversi ke stempel waktu satu kali (ketika pernyataan yang disiapkan diuraikan), dan now() dipanggil dua kali.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ambil catatan N pertama dari array JSON dengan kueri Postgresql

  2. haruskah saya mengaktifkan kumpulan pernyataan c3p0?

  3. Erlang dan PostgreSQL

  4. Bagaimana cara meningkatkan ke PostgreSQL 11 untuk Ubuntu 18.04?

  5. Menghasilkan peringkat urutan terurut pada kueri kompleks