PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Postgres now() kontra „teraz” w funkcji

To nie jest błąd, to funkcja... Są tu dwie kwestie.

  1. Zastąpienie „teraz”

    Zajrzyjmy do dokumentacji (Data /Funkcje i operatory czasu ):

    Więc 'now' jest konwertowany na znacznik czasu w czasie analizy.

  2. Przygotowane oświadczenia

    No dobrze, ale co to oznacza w odniesieniu do funkcji? Łatwo zademonstrować, że funkcja jest interpretowana za każdym razem, gdy ją wywołasz:

    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)
    

    W tym przykładzie 'now' zachowuje się zgodnie z oczekiwaniami.

    Jaka jest różnica? Twoja funkcja używa instrukcji SQL, a test() nie. Przyjrzyjmy się jeszcze raz dokumentacji (PL/ Buforowanie planu pgSQL ):

    I tutaj (Przygotuj oświadczenie ):

    Stąd 'now' został przekonwertowany na znacznik czasu podczas analizowania przygotowanej instrukcji. Zademonstrujmy to, tworząc przygotowaną instrukcję poza funkcją:

    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)
    

Tak się stało. 'now' został raz przekonwertowany na znacznik czasu (gdy przygotowana instrukcja była analizowana), a now() został wywołany dwukrotnie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekonwertować tablicę 2d z PostgreSQL DB na tablicę java 2d za pomocą JDBI?

  2. Postgres to najfajniejsza baza danych – Powód 1:Deweloperzy to uwielbiają!

  3. Funkcja zwracająca dynamiczny zestaw kolumn dla danej tabeli

  4. Wartość klucza podstawowego nie zwiększa się prawidłowo

  5. Jak stworzyć klucz podstawowy składający się z dwóch pól w Django?