Custom Date/Time formatting in SQL Server
Mastering Custom Date and Time Formatting in SQL Server

Unlock the full potential of SQL Server's date and time functions to display data exactly how you need it, from simple dates to complex custom formats.
SQL Server offers robust capabilities for handling date and time data. While default formats are often sufficient, there are many scenarios where custom formatting is essential for reporting, data presentation, or integration with other systems. This article will guide you through the various methods available in SQL Server to achieve precise control over your date and time output, from basic conversions to advanced custom patterns.
Understanding Basic Date/Time Conversion with CONVERT and CAST
The CONVERT
and CAST
functions are fundamental for changing data types in SQL Server, including date and time values. CONVERT
is particularly powerful for dates because it allows you to specify a style code, which dictates the output format. CAST
is simpler and generally used for converting a date/time to a string using the default format for the target data type, or for converting a string to a date/time if the string is in a recognized format.
SELECT
GETDATE() AS CurrentDateTime,
CONVERT(VARCHAR, GETDATE(), 101) AS 'MM/DD/YYYY',
CONVERT(VARCHAR, GETDATE(), 103) AS 'DD/MM/YYYY',
CONVERT(VARCHAR, GETDATE(), 108) AS 'HH:MI:SS',
CONVERT(VARCHAR, GETDATE(), 120) AS 'YYYY-MM-DD HH:MI:SS (ODBC canonical)',
CAST(GETDATE() AS DATE) AS 'DateOnly',
CAST(GETDATE() AS TIME) AS 'TimeOnly';
Examples of CONVERT
and CAST
for common date/time formats.
VARCHAR
length when using CONVERT
. If the specified length is too short, the output will be truncated. For example, CONVERT(VARCHAR(10), GETDATE(), 120)
will only return 'YYYY-MM-DD'.Advanced Formatting with FORMAT Function (SQL Server 2012+)
For more flexible and culture-aware formatting, SQL Server 2012 introduced the FORMAT
function. This function leverages .NET Framework formatting rules, providing a vast array of custom format specifiers and the ability to specify a culture. This makes it ideal for applications that need to display dates and times differently based on regional settings.
SELECT
GETDATE() AS CurrentDateTime,
FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss') AS 'Custom Format',
FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy') AS 'Full Date Name',
FORMAT(GETDATE(), 'hh:mm tt') AS '12-Hour Time',
FORMAT(GETDATE(), 'yyyy-MM-dd', 'en-US') AS 'US Culture Date',
FORMAT(GETDATE(), 'yyyy-MM-dd', 'de-DE') AS 'German Culture Date',
FORMAT(GETDATE(), 'dd/MM/yyyy HH:mm:ss.fff') AS 'Date with Milliseconds';
Using the FORMAT
function for custom and culture-specific date/time outputs.
flowchart TD A[Start with DateTime Value] --> B{Choose Formatting Method?} B -->|Simple, Style Code| C[Use CONVERT] C --> C1[Specify Style Code (e.g., 101, 120)] C1 --> D[Result: Formatted String] B -->|Complex, Culture-Aware| E[Use FORMAT] E --> E1[Specify Custom Format String (e.g., 'yyyy-MM-dd')] E1 --> E2{Specify Culture?} E2 -->|Yes| E3[Provide Culture Code (e.g., 'en-US')] E2 -->|No| E4[Use Default Culture] E3 --> D E4 --> D
Decision flow for choosing between CONVERT
and FORMAT
for date/time formatting.
Handling NULL Values and Error Prevention
When dealing with date and time formatting, it's crucial to consider NULL
values. If a date column can be NULL
, applying formatting functions directly will result in NULL
output. You might want to display an empty string or a specific placeholder instead. Additionally, ensure that any string inputs you convert to date/time are in a valid format to prevent conversion errors.
DECLARE @NullableDate DATETIME = NULL;
DECLARE @ValidDate DATETIME = GETDATE();
SELECT
ISNULL(FORMAT(@NullableDate, 'yyyy-MM-dd'), 'N/A') AS 'Formatted Null Date',
ISNULL(FORMAT(@ValidDate, 'yyyy-MM-dd'), 'N/A') AS 'Formatted Valid Date';
-- Example of error handling for invalid date strings
BEGIN TRY
SELECT CONVERT(DATETIME, 'Invalid Date String');
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS 'Conversion Error';
END CATCH;
Handling NULL
values and demonstrating error prevention during date conversion.
YEAR(date) + '-' + MONTH(date)
) can lead to implicit conversions and unexpected results. Always use CONVERT
or FORMAT
for reliable string representations of dates.