sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres now() vs 'nu' i funktion

Det er ikke en fejl, det er en funktion... Der er to punkter her.

  1. Erstatning af 'nu'

    Lad os se på dokumentationen (Dato /Tidsfunktioner og operatører ):

    'now' konverteres til et tidsstempel på parsetidspunktet.

  2. Udarbejdede erklæringer

    Okay, men hvad betyder det med hensyn til funktioner? Det er nemt at demonstrere, at en funktion fortolkes, hver gang du kalder den:

    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)
    

    I dette eksempel 'now' opfører sig som forventet.

    Hvad er forskellen? Din funktion bruger SQL-sætninger, og test() gør det ikke. Lad os se på dokumentationen igen (PL/ pgSQL Plan Caching ):

    Og her (Forbered erklæring ):

    Derfor 'now' blev konverteret til et tidsstempel, da forberedt sætning blev parset. Lad os demonstrere dette ved at oprette en forberedt erklæring uden for en funktion:

    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)
    

Det er, hvad der skete. 'now' blev konverteret til et tidsstempel én gang (når forberedt sætning blev parset), og now() blev ringet op to gange.



  1. forskel mellem primær nøgle og unik nøgle

  2. Er der et problem med JPA Entities, Oracle 10g og Calendar Type-egenskaber?

  3. MySQL Vælg Where In Many to Many

  4. Ydeevne af MySQL Insert-sætninger i Java:Batch-tilstand forberedte sætninger vs enkelt insert med flere værdier