Convert String to Date SQL
Converting String to Date in SQL: A Comprehensive Guide

Learn how to effectively convert string representations of dates into proper DATE or DATETIME data types across various SQL dialects, ensuring data integrity and enabling date-based operations.
Working with dates in SQL databases is a common task, but often dates are stored as strings, especially when data is imported from external sources or entered manually without strict validation. While it might seem convenient to store dates as strings, it can lead to significant issues with data integrity, sorting, filtering, and performing date-specific calculations. This article will guide you through the process of converting string values into proper date or datetime data types in SQL, focusing on common SQL Server functions and best practices.
Why Convert Strings to Dates?
Storing dates as strings can introduce several problems. For instance, a string like '01/02/2023' could be interpreted as January 2nd or February 1st, depending on regional settings. String comparisons for dates also don't work as expected; '01/01/2023' is considered 'less than' '12/31/2022' when compared as strings, which is incorrect chronologically. Converting to a native date type ensures:
- Correct Sorting and Filtering: Dates will sort chronologically.
- Accurate Calculations: You can perform operations like adding days, finding differences, or extracting parts (year, month, day).
- Data Integrity: The database enforces valid date formats.
- Performance: Date operations on native types are generally more efficient.
flowchart TD A[Data Ingestion] --> B{Is Date Stored as String?} B -- Yes --> C[Problem: Inconsistent Formats] C --> D[Problem: Incorrect Sorting/Filtering] D --> E[Problem: Calculation Errors] B -- No --> F[Solution: Convert to Date Type] F --> G[Benefit: Data Integrity] G --> H[Benefit: Accurate Operations] H --> I[Benefit: Improved Performance]
Flowchart illustrating the problems of string dates and benefits of conversion.
Common SQL Functions for Date Conversion
Most SQL database systems provide dedicated functions for converting strings to date or datetime types. The exact function names and syntax can vary slightly between different database management systems (DBMS) like SQL Server, MySQL, PostgreSQL, and Oracle. We'll primarily focus on SQL Server's CONVERT
and CAST
functions, which are widely used and offer robust functionality.
Using CONVERT
in SQL Server
The CONVERT
function is highly versatile in SQL Server for converting expressions from one data type to another. For date conversions, it allows you to specify a 'style' code that matches the format of your input string. This is particularly useful when dealing with various regional date formats.
SELECT CONVERT(DATE, '2023-10-26');
-- Result: 2023-10-26
SELECT CONVERT(DATETIME, '2023-10-26 14:30:00');
-- Result: 2023-10-26 14:30:00.000
SELECT CONVERT(DATE, '10/26/2023', 101); -- MM/DD/YYYY
-- Result: 2023-10-26
SELECT CONVERT(DATE, '26-10-2023', 103); -- DD-MM-YYYY
-- Result: 2023-10-26
SELECT CONVERT(DATETIME, '26 Oct 2023 14:30:00', 106); -- DD MON YYYY HH:MI:SS
-- Result: 2023-10-26 14:30:00.000
Examples of using CONVERT
with different date string formats and style codes.
The third parameter in CONVERT
is the style
code. SQL Server provides a wide range of style codes to handle various date and time formats. Some common ones include:
101
: MM/DD/YYYY103
: DD/MM/YYYY106
: DD MON YYYY110
: MM-DD-YYYY120
: YYYY-MM-DD HH:MI:SS (ODBC canonical)121
: YYYY-MM-DD HH:MI:SS.mmm (ODBC canonical with milliseconds)
Using TRY_CONVERT
for Error Handling
When dealing with potentially malformed or inconsistent date strings, CONVERT
will raise an error if the conversion fails. This can halt your query or process. SQL Server offers TRY_CONVERT
, which returns NULL
instead of an error if the conversion is unsuccessful. This is invaluable for data cleansing and robust ETL processes.
SELECT TRY_CONVERT(DATE, '2023-10-26');
-- Result: 2023-10-26
SELECT TRY_CONVERT(DATE, 'Invalid Date String');
-- Result: NULL
SELECT COALESCE(TRY_CONVERT(DATE, 'Invalid Date String'), '1900-01-01');
-- Result: 1900-01-01 (Provides a default date for invalid entries)
Using TRY_CONVERT
to handle invalid date strings gracefully.
Using CAST
in SQL Server
The CAST
function is another standard SQL function for type conversion. While CONVERT
offers more control with style codes, CAST
is simpler and often preferred for straightforward conversions where the string is already in a recognized ISO 8601 format (e.g., 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MI:SS').
SELECT CAST('2023-10-26' AS DATE);
-- Result: 2023-10-26
SELECT CAST('2023-10-26 14:30:00' AS DATETIME);
-- Result: 2023-10-26 14:30:00.000
Examples of using CAST
for date and datetime conversions.
CAST
with ambiguous date string formats (e.g., '01/02/2023') as its interpretation might depend on the database's default language settings, leading to unexpected results.Cross-DBMS Considerations
While CONVERT
and CAST
are prevalent in SQL Server, other DBMS have their own functions:
- MySQL: Uses
STR_TO_DATE(string, format)
. - PostgreSQL: Uses
TO_DATE(string, format)
orstring::date
(cast operator). - Oracle: Uses
TO_DATE(string, format)
.
Always consult your specific DBMS documentation for the most accurate and efficient conversion methods.
SQL Server
SELECT CONVERT(DATE, '2023-10-26', 120);
MySQL
SELECT STR_TO_DATE('2023-10-26', '%Y-%m-%d');
PostgreSQL
SELECT TO_DATE('2023-10-26', 'YYYY-MM-DD'); -- OR SELECT '2023-10-26'::DATE;
Oracle
SELECT TO_DATE('2023-10-26', 'YYYY-MM-DD') FROM DUAL;
Best Practices for Date Conversion
To avoid common pitfalls and ensure robust date handling:
- Standardize Formats: Whenever possible, store dates in a consistent, unambiguous format (e.g., ISO 8601:
YYYY-MM-DD
orYYYY-MM-DD HH:MI:SS
). - Use Native Date Types: Always store dates in
DATE
,DATETIME
,DATETIME2
, orTIMESTAMP
columns, notVARCHAR
. - Validate Input: Before inserting or updating, validate date strings at the application layer or use
TRY_CONVERT
in SQL. - Specify Style Codes: When using
CONVERT
, always provide the style code to explicitly define the input format, even if it seems obvious. - Test Thoroughly: Test your conversion logic with various valid and invalid date strings to ensure it behaves as expected.