PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Postgres now() срещу 'now' във функцията

Това не е грешка, а функция... Тук има два момента.

  1. Замяна на „сега“

    Нека да разгледаме документацията (Дата /Времеви функции и оператори ):

    Така че 'now' се преобразува в клеймо за време по време на анализ.

  2. Подготвени отчети

    Добре, но какво означава по отношение на функциите? Лесно е да се демонстрира, че дадена функция се интерпретира всеки път, когато я извикате:

    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)
    

    В този пример 'now' се държи както очаквате.

    Каква е разликата? Вашата функция използва SQL изрази, а test() не. Нека отново да разгледаме документацията (PL/ pgSQL план за кеширане ):

    И тук (Подгответе изявление ):

    Следователно 'now' беше преобразуван в клеймо за време, когато подготвеният израз беше анализиран. Нека демонстрираме това, като създадем подготвен израз извън функция:

    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)
    

Ето какво се случи. 'now' беше преобразуван в клеймо за време веднъж (когато подготвеният израз беше анализиран) и now() беше извикан два пъти.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разширено индексиране, включващо OR-ed условия (pgsql)

  2. PostgreSQL - създайте нова база данни чрез pgAdmin UI

  3. Възстановете отдалечен дъмп към RDS

  4. Можем ли винаги да извличаме колона с дата като низ (varchar) с knex и postgres?

  5. Различни записи с обединения и ред