sql >> Databáze >  >> RDS >> PostgreSQL

Postgres now() vs 'now' ve funkci

Není to chyba, je to funkce... Jsou zde dva body.

  1. Nahrazení 'nyní'

    Pojďme se podívat do dokumentace (Datum /Časové funkce a operátoři ):

    Takže 'now' je převeden na časové razítko v čase analýzy.

  2. Připravené výpisy

    Dobře, ale co to znamená s ohledem na funkce? Je snadné demonstrovat, že funkce je interpretována pokaždé, když ji zavoláte:

    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)
    

    V tomto příkladu 'now' chová se tak, jak jste očekávali.

    Jaký je rozdíl? Vaše funkce používá příkazy SQL a test() nikoli. Pojďme se znovu podívat do dokumentace (PL/ Ukládání plánu pgSQL do mezipaměti ):

    A zde (Příprava prohlášení ):

    Proto 'now' byl převeden na časové razítko, když byl připravený příkaz analyzován. Pojďme si to ukázat vytvořením připraveného příkazu mimo funkci:

    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)
    

To se stalo. 'now' byl převeden na časové razítko jednou (když byl připravený příkaz analyzován) a now() byl volán dvakrát.



  1. Dapper.NET a uložený proc s více sadami výsledků

  2. ID řádků sqlite neodpovídají zobrazení seznamu - ANDROID

  3. Formát data SQL:Jak s ním zacházet chytře

  4. mysql-php dotazování seznamu za účelem vytvoření tabulky