In SQL Server, the CURRENT_TIMESTAMP function returns the current date and time with milliseconds precision without the time zone for the database server's host operating system.
CURRENT_TIMESTAMP returns the actual current date and time, but SQL Server can optimize how many times it is evaluated within a statement (run-time constant).
In PostgreSQL you can use the CLOCK_TIMESTAMP function, which also returns the actual current date and time, or the CURRENT_TIMESTAMP(3) function, which returns the start of the current transaction.
Note that PostgreSQL functions use the client's session time zone.
SQL Server:
-- Get the current date and time with milliseconds precision SELECT CURRENT_TIMESTAMP; /* 2026-08-08 17:43:36.913 */
PostgreSQL:
-- Get the current date and time with milliseconds precision SELECT CLOCK_TIMESTAMP()::TIMESTAMP(3); /* 2026-08-08 17:43:36.913 */ -- Without a cast to TIMESTAMP(3), CLOCK_TIMESTAMP uses microseconds precision and includes the time zone SELECT CLOCK_TIMESTAMP(); /* 2026-08-08 17:43:36.913794-07 */ -- CURRENT_TIMESTAMP uses microseconds precision by default and includes the time zone SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(3); /* 2026-08-08 17:44:37.850512-07 | 2026-08-08 17:44:37.851-07 */
Unlike SQL Server, where CURRENT_TIMESTAMP returns the actual current date and time, in PostgreSQL it returns the start date and time of the current transaction.
SQL Server:
-- Start a new transaction BEGIN TRANSACTION -- Get the current date and time SELECT CURRENT_TIMESTAMP; /* 2026-08-08 18:08:26.030 */ -- Wait 3 seconds WAITFOR DELAY '00:00:03' -- Get the current date and time again (reflects the 3-second wait) SELECT CURRENT_TIMESTAMP; /* 2026-08-08 18:08:29.030 */ COMMIT;
PostgreSQL:
-- Start a new transaction BEGIN; -- Get the current date and time SELECT CLOCK_TIMESTAMP(), CURRENT_TIMESTAMP; /* 2026-08-08 08:21:42.82698-07 | 2026-08-08 08:21:42.823941-07 */ -- Wait 3 seconds SELECT PG_SLEEP(3); -- Get the current date and time again (Only CLOCK_TIMESTAMP reflects the 3-second wait) SELECT CLOCK_TIMESTAMP(), CURRENT_TIMESTAMP; /* 2026-08-08 08:21:45.886739-07 | 2026-08-08 08:21:42.823941-07 */ COMMIT;
You can see that within the same transaction, PostgreSQL CURRENT_TIMESTAMP always returns the same value regardless of the transaction's duration. This might not always be the desired behavior.
In SQL Server, CURRENT_TIMESTAMP always uses the server instance time zone, while PostgreSQL functions use the client's session time zone.
PostgreSQL:
-- Get the current time zone SHOW TIMEZONE; /* America/Los_Angeles */ -- Get the current date and time SELECT CLOCK_TIMESTAMP(), CURRENT_TIMESTAMP; /* 2026-08-08 08:37:56.774409-07 | 2026-08-08 08:37:56.774334-07 */ -- Change the client's time zone SET SESSION TIME ZONE 'America/New_York'; -- Now functions return date and time in the new time zone SELECT CLOCK_TIMESTAMP(), CURRENT_TIMESTAMP; /* 2026-08-08 11:39:07.075324-04 | 2026-08-08 11:39:07.075248-04 */
For more information, see SQL Server to PostgreSQL Migration.