I’m writing this post as a way to help motivate the #SQLNewBloggers out there. Read the bottom for a few notes on structuring a post.
FORMAT is a function that was introduced in SQL Server 2012. It is designed to format dates and numbers as date/times. It was added to try and reduce the complexity and cumbersome nature of CONVERT and CAST.
What I didn’t know, which I did like, is that the FORMAT command can be driven by language settings. For example, if I take a specific date, like today, I can reformat the date based on a language code.
DECLARE @d DATETIME = GETDATE(); SELECT FORMAT ( @d, 'd', 'en-US' ) AS 'US English Result' ,FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English Result' ,FORMAT ( @d, 'd', 'de-de' ) AS 'German Result' ,FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC) Result'
The results of this code are different, based on the cultural settings. Of course, the Chinese settings is really the only good way to show dates without confusion.
This is interesting in that if you can get the regional settings for the client, you can easily return data in a format that makes sense to the user. Of course, we typically don’t want to do too much formatting on the server.
The default language is that of the current session. For dumb uni-lingual people like me, this isn’t an issue, but it might matter for people that speak multiple languages and might move from system to system.
It is interesting in that you can easily format the data from a date with FORMAT. For example, I change orders to match the Chinese format:
DECLARE @d DATETIME = GETDATE(); SELECT FORMAT( @d, 'YYYY/MM/DD');
That gets me “2015/07/20”.
I can easily change to other formats, adding in times, or even partial times that might not make sense. For example, the result below named “Hours” has only the date. The “Date and hours” has the date and the hour only.
DECLARE @d DATETIME = GETDATE(); SELECT 'Default' , FORMAT(@d, 'd') UNION SELECT 'Full Date' , FORMAT(@d, 'YYYY/MM/DD hh:mm:ss.ffff t zzz') UNION SELECT 'Date and hours' , FORMAT(@d, 'YYYY/MM/DD hh') UNION SELECT 'Date and minutes' , FORMAT(@d, 'YYYY/MM/DD mm') UNION SELECT 'Hours' , FORMAT(@d, 'hh'); -- ,FORMAT ( @d, 'yymmdd', 'en-gb' ) AS 'CleanUS'
The results are:
Date and hours 2015/11/20 04
Date and minutes 2015/11/20 11
Full Date 2015/11/20 04:11:28.9600 P -06:00
I think that there are lots of reporting queries where the formatting of dates would be handy and easier with FORMAT than CONVERT. It certainly is more intuitive to read than seeing something like “,110” in code.
I still have the habit of using CAST and CONVERT when I’m changing types, and I’ll continue to do that. Especially as FORMAT is really limited to date types. However when trying to get dates to render in proper formats, it’s a good choice.
This post came about while I was checking on another issue. I happened to run into the FORMAT command and hadn’t used it much, so I spent a few minutes messing around. This post came out of around 5 minutes of experimentation and 15-20 minutes of writing.
Formatting Types in the .NET Framework – https://msdn.microsoft.com/library/26etazsy.aspx