Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Postgres now() timestamp doesn't change, when script works

Tags:

My PHP script will work for several seconds, and I need to get real timestamp from Postgres database anytime. But when I fetch current_timestamp from Postgres, it always return same value.

Here is my example script (using DBAL):

    echo "DB:" . $dbal->fetchColumn("select current_timestamp") . PHP_EOL;     echo "PHP: " . date("Y-m-d H:i:s") . PHP_EOL;     sleep(3);      echo "DB:" . $dbal->fetchColumn("select current_timestamp") . PHP_EOL;     echo "PHP: " . date("Y-m-d H:i:s") . PHP_EOL;     sleep(3);      echo "DB:" . $dbal->fetchColumn("select current_timestamp") . PHP_EOL;     echo "PHP: " . date("Y-m-d H:i:s") . PHP_EOL; 

Here is the output:

DB:2014-05-07 11:59:50.118+04 PHP: 2014-05-07 11:59:50  DB:2014-05-07 11:59:50.118+04 PHP: 2014-05-07 11:59:53  DB:2014-05-07 11:59:50.118+04 PHP: 2014-05-07 11:59:56 

Postgres installed on local machine. Why it always returns same time? How to get real time?

I used now() function, there was same result. Postgres version: 9.3.4 x64. PHP version: 5.5.11

like image 753
nkuhta Avatar asked May 07 '14 08:05

nkuhta


People also ask

What does NOW () return in Postgres?

What is PostgreSQL Now Function? The Now() function is used to return the current date and time of the time zone (default or user-defined). Its return type is the timestamp with the time zone.

What is the difference between now () and Current_timestamp?

CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW() . Returns the current time as a value in 'hh:mm:ss' or hhmmss format, depending on whether the function is used in string or numeric context. The value is expressed in the session time zone.

How does Postgres store timestamp with timezone?

For timestamp with time zone , the internally stored value is always in UTC (Universal Coordinated Time, traditionally known as Greenwich Mean Time, GMT ). An input value that has an explicit time zone specified is converted to UTC using the appropriate offset for that time zone.


1 Answers

From TFM, highlights mine:

9.9.4. Current Date/Time

PostgreSQL provides a number of functions that return values related to the current date and time. These SQL-standard functions all return values based on the start time of the current transaction:

CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(precision) CURRENT_TIMESTAMP(precision) LOCALTIME LOCALTIMESTAMP LOCALTIME(precision) LOCALTIMESTAMP(precision) 

...

Since these functions return the start time of the current transaction, their values do not change during the transaction. This is considered a feature: the intent is to allow a single transaction to have a consistent notion of the "current" time, so that multiple modifications within the same transaction bear the same time stamp.

PostgreSQL also provides functions that return the start time of the current statement, as well as the actual current time at the instant the function is called. The complete list of non-SQL-standard time functions is:

transaction_timestamp() statement_timestamp() clock_timestamp() timeofday() now() 

transaction_timestamp() is equivalent to CURRENT_TIMESTAMP, but is named to clearly reflect what it returns. statement_timestamp() returns the start time of the current statement (more specifically, the time of receipt of the latest command message from the client). statement_timestamp() and transaction_timestamp() return the same value during the first command of a transaction, but might differ during subsequent commands. clock_timestamp() returns the actual current time, and therefore its value changes even within a single SQL command. timeofday() is a historical PostgreSQL function. Like clock_timestamp(), it returns the actual current time, but as a formatted text string rather than a timestamp with time zone value. now() is a traditional PostgreSQL equivalent to transaction_timestamp().

like image 117
deceze Avatar answered Oct 22 '22 16:10

deceze