Differences

This shows you the differences between two versions of the page.

sql-server-to-postgresql:sysdatetime [August 10, 2026 8:43 am]
sqlines created
sql-server-to-postgresql:sysdatetime [August 10, 2026 10:16 am] (current)
Line 1: Line 1:
-====== GETUTCDATE Function - SQL Server to PostgreSQL Migration ======+====== SYSDATETIME Function - SQL Server to PostgreSQL Migration ====== 
 + 
 +In SQL Server, the SYSDATETIME function returns the current date and time with 100 nanoseconds precision (7 fractional digits) **without** the time zone for the database server's host **operating system**.  
 + 
 +SYSDATETIME() returns the **actual** current date and time, but SQL Server can optimize how many times it is evaluated within a statement (run-time constant). {{:exclamation.png|}}  
 + 
 +In PostgreSQL you can use the CLOCK_TIMESTAMP function, which also returns the **actual** current date and time with **microseconds** precision (6 fractional digits) and in the **client's session** time zone. {{:exclamation.png|}}  
 + 
 +**SQL Server**: 
 + 
 +<code sql> 
 +  -- Get the current date and time with 100 nanoseconds precision 
 +  SELECT SYSDATETIME(); 
 +  /* 2026-08-10 12:01:50.1839299 */ 
 +</code> 
 + 
 +**PostgreSQL**: 
 + 
 +<code sql> 
 +  -- Get the current date and time with microseconds precision 
 +  SELECT CLOCK_TIMESTAMP()::TIMESTAMP; 
 +  /* 2026-08-10 12:01:50.183929 */ 
 +   
 +  -- Without a cast to TIMESTAMP, CLOCK_TIMESTAMP includes the time zone 
 +  SELECT CLOCK_TIMESTAMP(); 
 +  /* 2026-08-10 12:01:50.183929-07 */ 
 +</code> 
 + 
 +===== Execution Time - Why not NOW() or LOCALTIMESTAMP in PostgreSQL ===== 
 + 
 +Unlike the SYSDATETIME() and CLOCK_TIMESTAMP() functions, which return the **actual** current date and time, the NOW() and LOCALTIMESTAMP functions return the **start** date and time of the current **transaction**. {{:exclamation.png|}} 
 + 
 +**SQL Server**: 
 + 
 +<code sql> 
 +  -- Start a new transaction 
 +  BEGIN TRANSACTION 
 +   
 +  -- Get the current date and time 
 +  SELECT SYSDATETIME(); 
 +  /* 2026-08-10 12:08:33.8658770 */ 
 +   
 +  -- Wait 3 seconds 
 +  WAITFOR DELAY '00:00:03' 
 + 
 +  -- Get the current date and time again (reflects the 3-second wait) 
 +  SELECT SYSDATETIME(); 
 +  /* 2026-08-10 12:08:36.8682106 */  
 + 
 +  COMMIT; 
 +</code> 
 + 
 +**PostgreSQL**: 
 + 
 +<code sql> 
 +  -- Start a new transaction 
 +  BEGIN; 
 +   
 +  -- Get the current date and time 
 +  SELECT CLOCK_TIMESTAMP(), NOW(), LOCALTIMESTAMP; 
 +  /* 2026-08-10 12:08:33.865877-07 | 2026-08-10 12:08:33.865317-07 | 2026-08-10 12:08:33.865317 */ 
 +   
 +  -- 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(), NOW(), LOCALTIMESTAMP; 
 +  /* 2026-08-10 12:08:36.866251-07 | 2026-08-10 12:08:33.865317-07 | 2026-08-10 12:08:33.865317 */  
 + 
 +  COMMIT; 
 +</code> 
 + 
 +You can see that within the same transaction, NOW() and LOCALTIMESTAMP always return the same value regardless of the transaction's duration. This might not always be the desired behavior. {{:exclamation.png|}} 
 + 
 +===== Database Server and Session Time Zone ===== 
 + 
 +In SQL Server, SYSDATETIME() always uses the **server** instance time zone, while PostgreSQL functions use the **client's session** time zone. {{:exclamation.png|}} 
 + 
 +**PostgreSQL**: 
 + 
 +<code sql> 
 +  -- Get the current time zone 
 +  SHOW TIMEZONE; 
 +  /* America/Los_Angeles */ 
 + 
 +  -- Get the current date and time 
 +  SELECT CLOCK_TIMESTAMP(), NOW(), LOCALTIMESTAMP; 
 +  /* 2026-08-10 08:37:56.774409-07 | 2026-08-10 08:37:56.774334-07 | 2026-08-10 08:37:56.774334 */ 
 +   
 +  -- 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(), NOW(), LOCALTIMESTAMP; 
 +  /* 2026-08-10 11:39:07.075324-04 | 2026-08-10 11:39:07.075248-04 | 2026-08-10 11:39:07.075248 */ 
 +</code> 
 + 
 +For more information, see [[/sql-server-to-postgresql|SQL Server to PostgreSQL Migration]]. 
 + 
 +~~NOTOC~~