Learn more about SQL Server tools

mssqltips logo
 

Tutorials          DBA          Dev          BI          Career          Categories          Webcasts          Whitepapers          Today's Tip          Join

Tutorials      DBA      Dev      BI      Categories      Webcasts

DBA    Dev    BI    Categories

 
Failover Clustering in the Cloud - Understanding Your Options - Free Webinar
 

Format SQL Server Dates with FORMAT Function


By:   |   Last Updated: 2018-12-06   |   Comments (6)   |   Related Tips: More > Dates

Problem

SQL Server 2008 and earlier versions used the CONVERT functions to handle date formatting. In this tip, Date and Time Conversions Using SQL Server, we have a list of the available examples on how to use the CONVERT function to handle different date formats. 

As you may know, the CONVERT function is not very flexible and we have limited date formats. In SQL Server 2012 and later, a new function FORMAT has been introduced which is much easier to use to format dates.  This article shows different examples of using this new function to format dates.

Solution

Starting with SQL Server 2012, a new function to handle formatting dates was introduced which is similar to Oracle's to_date function. Many Oracle DBAs complained about the SQL Server CONVERT function and its poor flexibility and now we have a new way to format dates in SQL Server.

With the SQL Server FORMAT function we do not need to know the format number to use to get the right date format we want, we can just specify the display format we want and we get that format.

How to format SQL Server dates with FORMAT function

  1. Use the FORMAT function to format the date and time
  2. To get DD/MM/YYYY use SELECT FORMAT (getdate(), 'dd/MM/yyyy ') as date
  3. To get MM-DD-YY use SELECT FORMAT (getdate(), 'MM-dd-yy') as date
  4. Check out more examples below

The syntax of the SQL Server FORMAT function is the following:

FORMAT (value,format[,culture])
GO

SQL Server FORMAT Examples for Formatting Dates

Let's start with an example:

SELECT FORMAT (getdate(), 'dd-MM-yy') as date
GO

The format will be as follows:

  • dd - day number from 01-31
  • MM - month number from 01-12
  • yy - two digit year number

If this was run for March 21, 2018 the output would be: 21-03-18.

Let's try another one:

SELECT FORMAT (getdate(), 'hh:mm:ss') as time
GO

The format will be as follows:

  • hh - hour of day from 01-12
  • mm - minutes of hour from 00-59
  • ss - seconds of minute from 00-59

The output will be: 02:48:42.

SQL Server FORMAT with Culture

Another option for the FORMAT function is culture. With the culture option you can obtain regional formatting. Here is a list of culture codes to use with FORMAT.

For example in the USA, the format would be like:

SELECT FORMAT (getdate(), 'd', 'en-us') as date
GO

In the USA the format is month, day, year.

If this was run for March 21, 2018 the output would be: 3/21/2018

Another example where we will use the Spanish culture in Bolivia (es-bo):

SELECT FORMAT (getdate(), 'd', 'es-bo') as date
GO

In Bolivia the format is day, month, year.

If this was run for March 21, 2018 the output would be: 21/03/2018.

SQL Server FORMAT output examples

Below is a list of formats and an example of the output.  The date used for all of these examples is "2018-03-21 11:36:14.840".

Query Sample output
SELECT FORMAT (getdate(), 'dd/MM/yyyy ') as date 21/03/2018
SELECT FORMAT (getdate(), 'dd/MM/yyyy, hh:mm:ss ') as date 21/03/2018, 11:36:14
SELECT FORMAT (getdate(), 'dddd, MMMM, yyyy') as date Wednesday, March, 2018
SELECT FORMAT (getdate(), 'MMM dd yyyy') as date Mar 21 2018
SELECT FORMAT (getdate(), 'MM.dd.yy') as date 03.21.18
SELECT FORMAT (getdate(), 'MM-dd-yy') as date 03-21-18
SELECT FORMAT (getdate(), 'hh:mm:ss tt') as date 11:36:14 AM
SELECT FORMAT (getdate(), 'd','us') as date 03/21/2018

As you can see, we used a lot of options for the date and time formatting, which are listed below.

  • dd - this is day of month from 01-31
  • dddd - this is the day spelled out
  • MM - this is the month number from 01-12
  • MMM - month name abbreviated
  • MMMM - this is the month spelled out
  • yy - this is the year with two digits
  • yyyy - this is the year with four digits
  • hh - this is the hour from 01-12
  • HH - this is the hour from 00-23
  • mm - this is the minute from 00-59
  • ss - this is the second from 00-59
  • tt - this shows either AM or PM
  • d - this is day of month from 1-31 (if this is used on its own it will display the entire date)
  • us - this shows the date using the US culture which is MM/DD/YYYY

For all the different custom date and time format strings to use with the SQL Server FORMAT command, check out this list.

Next Steps


Last Updated: 2018-12-06


next webcast button


next tip button



About the author
MSSQLTips author Daniel Calbimonte Daniel Calbimonte is a Microsoft SQL Server MVP, Microsoft Certified Trainer and Microsoft Certified IT Professional.

View all my tips





Post a comment or let the author know this tip helped.

All comments are reviewed, so stay on subject or we may delete your comment. Note: your email address is not published. Required fields are marked with an asterisk (*).

*Name    *Email    Email me updates 


Signup for our newsletter
 I agree by submitting my data to receive communications, account updates and/or special offers about SQL Server from MSSQLTips and/or its Sponsors. I have read the privacy statement and understand I may unsubscribe at any time.



    



Monday, December 10, 2018 - 10:45:06 AM - Greg Robidoux Back To Top

Hi Doug, thanks for pointing out the error in the code.  The code above has been updated.

-Greg


Monday, December 10, 2018 - 8:55:28 AM - Doug Back To Top

In the 4 bulleted items at the top of the article, #2 states: To get DD-MM-YYYY use SELECT FORMAT (getdate(), 'dd/MM/yyyy ') as date. This is incorrect and would yield DD/MM/YYYY. Also, it should possibly be mentioned that FORMAT is a CLR function and, as such, is considerably slower than using CONVERT.

Ultimately, dates SHOULD be formatted by the front end (e.g. SSRS, Excel, .Net application, etc.) but if you are using it in a query and you've got thousands of rows with multiple dates/row to format, you are going to see a performance degradation.


Thursday, December 06, 2018 - 12:34:46 PM - Greg Robidoux Back To Top

Thanks clarkvera.

We will update the tip based on your suggestion.


Thursday, December 06, 2018 - 10:27:23 AM - clarkvera Back To Top

 It would be MUCH more useful if you used a date with a day that would obviously not be confused with a month. Like the March 21 instead of March 7.


Monday, July 02, 2018 - 2:05:45 PM - Melanie Leyrer Back To Top

I am new to SQL Server and want to create good habits for future business solutions.  I have an Access Database front end with a new SQL Server backend.  My customer wants to have same functionality to change an assignment time in their form by just typing "9a" and pressing the [Tab] key to get the converted result of 9:00 am (i.e., a Medium Date field in MS Access).  After moving the table data into SQL Server, it resulted in a datetime() format i.e., 1899-12-30 07:00:00.000  I have modified the column to be time(0) time(7) but MS Access still doesn't allow the conversion of their entry to medium date.  I have many forms and VBA Code to adjust if I can't find a simple solution.  In the meantime, I have created unbound text boxes which allow them to to type "9a" and convert the entry to a time value.  However, if the end-user types an inaccurate value, it will error.  So I created another process control to simply provide the correct values to choose from (i.e., 9:00 am, 9:15 am, etc.) after their unbound combo box selection it will update the table with a correct time format.  This is over the top on my part, but I don't have any other solution.  Any suggestions? 


Tuesday, May 01, 2012 - 9:47:08 AM - Mike Angelastro Back To Top

You missed a universal date format.  Sometimes the date must evaluated in a SELECT statement regardless of geographic location.

 


Learn more about SQL Server tools