Now() vs GetDate()
NOW() vs GETDATE(): Understanding Date and Time Functions in SQL

Explore the differences between NOW() and GETDATE() functions in SQL, focusing on their behavior in MySQL and SQL Server, and learn when to use each for accurate date and time retrieval.
When working with databases, accurately capturing the current date and time is a fundamental requirement. SQL provides several functions for this purpose, with NOW()
and GETDATE()
being two of the most common. While they both serve to return the current timestamp, their availability and behavior can differ significantly depending on the specific database system you are using, primarily MySQL and SQL Server. Understanding these distinctions is crucial for writing portable, efficient, and correct SQL queries.
NOW() Function: MySQL's Go-To Timestamp
The NOW()
function is predominantly associated with MySQL. It returns the current date and time as a DATETIME
value, in 'YYYY-MM-DD HH:MM:SS' format. Importantly, NOW()
returns the statement execution time, meaning that if you call NOW()
multiple times within a single statement or transaction, it will return the same value for all calls within that statement, even if a few milliseconds have passed. This can be a desirable feature for consistency in certain operations.
SELECT NOW();
-- Example Output: 2023-10-27 10:30:45
Basic usage of NOW() in MySQL.
NOW()
can also accept an optional argument for fractional seconds precision, e.g., NOW(3)
for milliseconds.GETDATE() Function: SQL Server's Current Timestamp
Conversely, GETDATE()
is the standard function for retrieving the current date and time in SQL Server. It returns the current database system timestamp as a DATETIME
value. Unlike MySQL's NOW()
, GETDATE()
in SQL Server returns the actual time of evaluation. This means if you call GETDATE()
multiple times within the same statement or batch, it might return slightly different values if enough time has elapsed between evaluations. SQL Server also offers SYSDATETIME()
for higher precision (up to 7 decimal places for seconds) and CURRENT_TIMESTAMP
as an ANSI SQL equivalent to GETDATE()
.
SELECT GETDATE();
-- Example Output: 2023-10-27 10:30:45.123
SELECT SYSDATETIME();
-- Example Output: 2023-10-27 10:30:45.1234567
Basic usage of GETDATE() and SYSDATETIME() in SQL Server.
Key Differences and Considerations
The primary difference lies in their database system specificity and their behavior regarding statement execution time versus evaluation time. While NOW()
is a MySQL-specific function (though some other databases might support it for compatibility), GETDATE()
is native to SQL Server. For cross-database compatibility, CURRENT_TIMESTAMP
is often preferred as it is part of the ANSI SQL standard and is supported by both MySQL and SQL Server, typically behaving like NOW()
in MySQL and GETDATE()
in SQL Server.
flowchart TD A[Start] A --> B{Database System?} B -->|MySQL| C[Use NOW()] B -->|SQL Server| D[Use GETDATE() or SYSDATETIME()] B -->|ANSI SQL Compliant| E[Use CURRENT_TIMESTAMP] C --> F[Returns statement execution time] D --> G[Returns actual evaluation time] E --> H[Behaves like NOW() in MySQL, GETDATE() in SQL Server] F --> I[End] G --> I H --> I
Decision flow for choosing date/time functions based on database system.
NOW()
and GETDATE()
are not universally interchangeable without potential syntax errors or behavioral changes.Practical Use Cases
Choosing the right function depends on your specific needs:
- For auditing or logging: If you need a consistent timestamp for all operations within a single statement (e.g., for
created_at
orupdated_at
columns in a batch insert), MySQL'sNOW()
behavior (statement execution time) can be beneficial. - For real-time accuracy: If you require the absolute latest timestamp at the moment of evaluation (e.g., for highly sensitive time-based calculations or event logging), SQL Server's
GETDATE()
orSYSDATETIME()
might be more appropriate. - For cross-database compatibility:
CURRENT_TIMESTAMP
is generally the safest choice if your application needs to support multiple database backends without extensive code changes.
MySQL
INSERT INTO logs (event_description, event_time) VALUES ('User login', NOW());
UPDATE products SET last_modified = NOW() WHERE product_id = 123;
SQL Server
INSERT INTO logs (event_description, event_time) VALUES ('User login', GETDATE());
UPDATE products SET last_modified = GETDATE() WHERE product_id = 123;
ANSI SQL (Cross-DB)
INSERT INTO logs (event_description, event_time) VALUES ('User login', CURRENT_TIMESTAMP);
UPDATE products SET last_modified = CURRENT_TIMESTAMP WHERE product_id = 123;