SQL Query to Get Current Date: A practical guide
When you need to work with dates in your database, one of the most common tasks is retrieving the current date. Think about it: whether you are logging timestamps, filtering records, or generating reports, knowing how to fetch today’s date using SQL is essential. This article walks you through the most widely used SQL date functions, explains how to apply them in various scenarios, and highlights important considerations for different database systems Most people skip this — try not to..
Why You Might Need the Current Date
- Audit trails: Recording when a row was inserted or last updated.
- Reporting: Calculating age, duration, or period‑based metrics.
- Dynamic queries: Filtering data based on today’s date (e.g., “show me all upcoming events”).
- Data validation: Ensuring that date fields are not in the future.
Understanding the syntax for each major RDBMS helps you write portable and efficient queries while avoiding common pitfalls such as time‑zone mismatches or data‑type conflicts.
Common SQL Date Functions for Retrieving Today’s Date
SQL syntax varies across platforms, but most relational databases provide built‑in functions to return the current date. Below are the most popular options:
1. CURRENT_DATE – ANSI‑SQL Standard
SELECT CURRENT_DATE;
- Returns the current date in the session’s timezone, without a time component.
- Supported by PostgreSQL, MySQL, SQLite, Oracle, and others.
2. GETDATE() – SQL Server
SELECT GETDATE();
- Returns a
datetimevalue that includes both date and time. - In SQL Server, you can cast it to a date using
CAST(GETDATE() AS DATE)if you need only the date part.
3. SYSDATE – Oracle & MySQL (older versions)
SELECT SYSDATE FROM dual;
- In Oracle,
SYSDATEincludes time zone information. - MySQL also supports
SYSDATE(), which returns a datetime with fractional seconds.
4. NOW() – MySQL & PostgreSQL
SELECT NOW();
- Returns the current date and time as a
datetimeortimestamp. - PostgreSQL’s
NOW()is an alias forCURRENT_TIMESTAMP.
5. CURRENT_TIMESTAMP – ANSI‑SQL
SELECT CURRENT_TIMESTAMP;
- Similar to
NOW(), it provides both date and time with timezone awareness in many DBMS.
Practical Examples in SELECT Statements
Basic Retrieval
-- Using CURRENT_DATE
SELECT CURRENT_DATE AS today;
-- Using GETDATE()
SELECT CAST(GETDATE() AS DATE) AS today;
Both queries return today’s date in a column named today.
Filtering Rows by Today’s Date
Suppose you have a table appointments with a appointment_date column and you want to list all appointments scheduled for today Less friction, more output..
SELECT *
FROM appointments
WHERE appointment_date = CURRENT_DATE;
For SQL Server:
SELECT *
FROM appointments
WHERE CAST(appointment_date AS DATE) = CAST(GETDATE() AS DATE);
Inserting the Current Date
When inserting a new record, you can automatically populate a date column:
INSERT INTO employees (name, hire_date)
VALUES ('Jane Doe', CURRENT_DATE);
SQL Server version:
INSERT INTO employees (name, hire_date)
VALUES ('Jane Doe', CAST(GETDATE() AS DATE));
Calculating Age or Duration
If you need to compute how many days a user has been active since a start date, subtract the current date from a reference date:
SELECT DATEDIFF(CURRENT_DATE, start_date) AS days_active
FROM users
WHERE user_id = 123;
In SQL Server:
SELECT DATEDIFF(day, start_date, CAST(GETDATE() AS DATE)) AS days_active
FROM users
WHERE user_id = 123;
Formatting the Current Date
Often you’ll want the date in a specific format (e.g., YYYY-MM-DD, DD/MM/YYYY).
- MySQL:
DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d') - PostgreSQL:
TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD') - SQL Server:
CONVERT(VARCHAR(10), GETDATE(), 120)(returns ISO format)
Example:
SELECT DATE_FORMAT(CURRENT_DATE, '%Y-%m-%d') AS formatted_date;
Database‑Specific Considerations
| Database | Function | Returns Type | Notes |
|---|---|---|---|
| MySQL | CURRENT_DATE |
date |
No time component |
| MySQL | NOW() |
datetime |
Includes seconds |
| PostgreSQL | CURRENT_DATE |
date |
Timezone‑aware |
| PostgreSQL | NOW() |
timestamp |
With time zone if timestamptz |
| SQL Server | GETDATE() |
datetime |
Use SYSDATETIME() for higher precision |
| Oracle | SYSDATE |
date |
Includes timezone offset |
| Oracle | SYSTIMESTAMP |
timestamp |
Higher precision, time zone |
When writing cross‑platform scripts, you may need to wrap the function in a conditional block or use a portable approach like CURRENT_DATE wherever possible.
Handling Time Zones and Data Types
- Time Zone Consistency: If your application stores timestamps in UTC but displays them in a local timezone, always convert the current date using the appropriate timezone function (
AT TIME ZONEin PostgreSQL,SWITCHOFFSETin SQL Server, etc.). - Data Type Matching: Ensure the column you compare against matches the type returned by the date function. Mixing
dateanddatetimecan lead to implicit conversions that may affect performance. - Precision: For high‑frequency logging, consider using
SYSDATETIME()(SQL Server) orSYSDATEwith fractional seconds (Oracle) instead of simple date functions.
Frequently Asked Questions (FAQ)
1. Can I get both date and time in a single query?
Yes. Use CURRENT_TIMESTAMP, NOW(), or GETDATE() depending on your DBMS. These functions return a combined date‑time value Simple, but easy to overlook. No workaround needed..
2. How do I retrieve yesterday’s date?
SELECT CURRENT_DATE - INTERVAL '1 day' AS yesterday;
SQL Server:
SELECT CAST(GETDATE() AS DATE) - 1 AS yesterday;
3. What if I need the current date in a specific format for reports?
Apply the formatting function of your database (e.g., DATE_FORMAT(), TO_CHAR(), CONVERT()). This returns a string representation ready for display That alone is useful..
4. Are there any performance impacts of using date functions in WHERE clauses?
Using functions on columns (e.g., WHERE DATE(column) = CURRENT_DATE) can prevent index usage. Instead, store dates in a proper date or datetime column and compare directly: WHERE column = CURRENT_DATE.
5. How does SQL handle leap seconds or daylight saving changes?
Most standard SQL databases do not account for leap seconds. They rely on the underlying operating system’s clock, which typically smears or ignores leap seconds entirely. For daylight saving time (DST), behavior depends heavily on the data type and database configuration:
TIMESTAMP WITH TIME ZONE(PostgreSQL, OracleTIMESTAMP WITH TIME ZONE): Stores values internally in UTC. When you insertCURRENT_TIMESTAMPorNOW(), the database records the instant in UTC. Retrieval converts it to the session’s time zone, automatically applying the correct DST offset for that specific date in history.TIMESTAMP WITHOUT TIME ZONE/DATETIME(MySQL, SQL Server): Stores the "wall clock" time literally, with no zone context. If you insertNOW()during DST and query it in standard time (or vice versa), the value does not shift. It represents a local time that is ambiguous during transition periods.- Session Time Zone: The result of
CURRENT_TIMESTAMPorNOW()is calculated based on the session time zone (or server system time zone if session is not set). Changing the session time zone (SET TIME ZONE 'America/New_York') immediately changes the output of these functions without requiring a reconnection.
Best Practice: Always store timestamps in TIMESTAMP WITH TIME ZONE (or DATETIMEOFFSET in SQL Server) and UTC. Perform time zone conversions only at the application/presentation layer Less friction, more output..
6. How can I generate a series of dates (e.g., for a calendar table)?
- PostgreSQL:
SELECT generate_series('2024-01-01'::date, '2024-12-31'::date, '1 day')::date AS calendar_date; - MySQL 8.0+ / MariaDB: Recursive CTE:
WITH RECURSIVE dates AS ( SELECT '2024-01-01' AS dt UNION ALL SELECT DATE_ADD(dt, INTERVAL 1 DAY) FROM dates WHERE dt < '2024-12-31' ) SELECT dt FROM dates; - SQL Server: Recursive CTE (requires
OPTION (MAXRECURSION 0)for >100 rows) orDATEADDwith a numbers/tally table.
7. What is the safest way to query "the last 30 days" inclusive of today?
Avoid BETWEEN with datetime types due to boundary issues (midnight precision). Use half-open intervals:
-- Standard SQL (PostgreSQL, MySQL, Oracle, SQL Server 2012+)
WHERE event_timestamp >= CURRENT_DATE - INTERVAL '30 days'
AND event_timestamp < CURRENT_DATE + INTERVAL '1 day';
This captures all moments from 30 days ago at 00:00:00.000 up to (but not including) tomorrow at 00:00:00.000, guaranteeing no data loss or duplication regardless of time precision It's one of those things that adds up..
Best Practices Summary
| Scenario | Recommendation |
|---|---|
| Storage | Use TIMESTAMP WITH TIME ZONE (PG/Oracle) or DATETIMEOFFSET (SQL Server). Store in UTC. Here's the thing — |
| Filtering | Never wrap columns in functions (`WHERE DATE(col) = ... In practice, |
| Current Time | Use CURRENT_TIMESTAMP (standard) or NOW() (MySQL/PG) for transaction start time; CLOCK_TIMESTAMP() (PG) / SYSDATETIME() (SQL Server) for statement-level precision. `). On top of that, |
| Formatting | Defer formatting (TO_CHAR, FORMAT, DATE_FORMAT) to the application layer. Use half-open intervals (col >= start AND col < end). Because of that, keep SQL returning native types. |
| Portability | Abstract vendor-specific functions (GETDATE(), SYSDATE, NOW()) behind a view or ORM layer if supporting multiple RDBMS. |
Conclusion
Mastering date and time handling in SQL is less about memorizing vendor-specific syntax and more about understanding the semantics of your data types. The distinction between a "moment in time" (timezone-aware timestamp) and a "calendar date" (timezone-agnostic) dictates every decision—from indexing strategy and partition pruning to the correctness of business logic spanning daylight saving transitions That's the whole idea..
By standardizing on UTC storage, leveraging timezone-aware types, filtering with half-open intervals, and pushing presentation formatting to the client, you eliminate an entire class of subtle, time-dependent bugs. Whether you are building a high-frequency trading ledger or a simple appointment scheduler, treating time as a first-class citizen in your schema design pays dividends in reliability, performance, and maintainability across every database platform.