SQL Server: Formatting DateTime values

by Olaf Rabbachin 28. December 2009 19:03

Here’s a little quickie that should help you easily format date values in SQL Server queries (with or without a time portion). I have been using this UDF for many years, after I found it somewhere on the web. That is, I can’t take any credit for the original portion (which already contained a couple of target-formats), but back when I found it, I didn’t make a note of the original author. Over the years I added new formats whenever I needed them, so there’s quite a few at present.

Here’s the ready-to-paste UDF:

/*

	Returns the formatted equivalent of the passed date/datetime.

*/
CREATE FUNCTION [dbo].[f_FormatDateTime] 
( 
    @dte DATETIME, 
    @format VARCHAR(16) 
) 
RETURNS VARCHAR(64) 
AS 
BEGIN 
	DECLARE @dtVC VARCHAR(64) 
	SELECT @dtVC = CASE @format 

	/*
		All samples for the formats below have been created with ...
	
		DECLARE @dte datetime;
		SET @dte = '20091228 18:45:00.000';
		SELECT [dbo].[f_FormatDateTime](@dte,'[the format]');	
	
		... and thus relate to Dec. 28, 2009 (6:45 pm).
	*/

	-- Returns i.e. "Monday, December 28, 2009"
	WHEN 'LONGDATE' THEN 
		DATENAME(dw, @dte) 
		+ ',' + SPACE(1) + DATENAME(m, @dte) 
		+ SPACE(1) + CAST(DAY(@dte) AS VARCHAR(2)) 
		+ ',' + SPACE(1) + CAST(YEAR(@dte) AS CHAR(4)) 

	-- Returns i.e. "Monday, December 28, 2009  6:45:00 PM"
	WHEN 'LONGDATEANDTIME' THEN 
		DATENAME(dw, @dte) 
		+ ',' + SPACE(1) + DATENAME(m, @dte) 
		+ SPACE(1) + CAST(DAY(@dte) AS VARCHAR(2)) 
		+ ',' + SPACE(1) + CAST(YEAR(@dte) AS CHAR(4)) 
		+ SPACE(1) + RIGHT(CONVERT(CHAR(20), 
		@dte - CONVERT(DATETIME, CONVERT(CHAR(8), 
		@dte, 112)), 22), 11) 

	-- Returns i.e. "Dec 28 2009"
	WHEN 'SHORTDATE' THEN 
		LEFT(CONVERT(CHAR(19), @dte, 0), 11) 

	-- Returns i.e. "Dec 28 2009  6:45 PM" 
	WHEN 'SHORTDATEANDTIME' THEN 
		REPLACE(REPLACE(CONVERT(CHAR(19), @dte, 0), 'AM', ' AM'), 'PM', ' PM') 

	-- Returns i.e. "1262025985" 
	WHEN 'UNIXTIMESTAMP' THEN 
		CAST(DATEDIFF(SECOND, '19700101', @dte) AS VARCHAR(64)) 

	-- Returns i.e. "20091228" 
	WHEN 'YYYYMMDD' THEN 
		CONVERT(CHAR(8), @dte, 112) 

	-- Returns i.e. "2009-12-28" 
	WHEN 'YYYY-MM-DD' THEN 
		CONVERT(CHAR(10), @dte, 23) 

	-- Returns i.e. "20091228" 
	WHEN 'YYMMDD' THEN 
		CONVERT(VARCHAR(8), @dte, 12) 

	-- Returns i.e. "09-12-28" 
	WHEN 'YY-MM-DD' THEN 
		STUFF(STUFF(CONVERT(VARCHAR(8), @dte, 12), 5, 0, '-'), 3, 0, '-') 

	-- Returns i.e. "091228"
	WHEN 'MMDDYY' THEN 
		REPLACE(CONVERT(CHAR(8), @dte, 10), '-', SPACE(0)) 

	-- Returns i.e. "12-28-09" 
	WHEN 'MM-DD-YY' THEN 
		CONVERT(CHAR(8), @dte, 10) 

	-- Returns i.e. "12/28/09" 
	WHEN 'MM/DD/YY' THEN 
		CONVERT(CHAR(8), @dte, 1) 

	-- Returns i.e. "12/28/2009" 
	WHEN 'MM/DD/YYYY' THEN 
		CONVERT(CHAR(10), @dte, 101) 

	-- Returns i.e. "281209" 
	WHEN 'DDMMYY' THEN 
		REPLACE(CONVERT(CHAR(8), @dte, 3), '/', SPACE(0)) 

	-- Returns i.e. "28-12-09" 
	WHEN 'DD-MM-YY' THEN 
		REPLACE(CONVERT(CHAR(8), @dte, 3), '/', '-') 

	-- Returns i.e. "12/28/09" 
	WHEN 'DD/MM/YY' THEN 
		CONVERT(CHAR(8), @dte, 3) 

	-- Returns i.e. "28.12.09" 
	WHEN 'DD.MM.YY' THEN
		CONVERT(CHAR(8), @dte, 4) 

	-- Returns i.e. "28/12/2009" 
	WHEN 'DD/MM/YYYY' THEN 
		CONVERT(CHAR(10), @dte, 103) 

	-- Returns i.e. "28.12.2009" 
	WHEN 'DD.MM.YYYY' THEN
		CONVERT(CHAR(10), @dte, 104) 

	-- Returns i.e. "18:45:00" 
	WHEN 'HH:MM:SS 24' THEN 
		CONVERT(CHAR(8), @dte, 8) 

	-- Returns i.e. "18:45" 
	WHEN 'HH:MM 24' THEN 
		LEFT(CONVERT(VARCHAR(8), @dte, 8), 5) 

	-- Returns i.e. "6:45:00 PM" 
	WHEN 'HH:MM:SS 12' THEN 
		LTRIM(RIGHT(CONVERT(VARCHAR(20), @dte, 22), 11)) 

	-- Returns i.e. "6:45 PM" 
	WHEN 'HH:MM 12' THEN 
		LTRIM(SUBSTRING(CONVERT(VARCHAR(20), @dte, 22), 10, 5) 
			+ RIGHT(CONVERT(VARCHAR(20), @dte, 22), 3)) 

	ELSE 
		'Invalid format specified' 

	END 
	RETURN @dtVC 
END

 

Call it i.e. with a simple …

SELECT dbo.f_FormatDateTime(GETDATE() ,'MM/DD/YYYY');

 

Happy coding!


Location: PostList

Tags: , ,

SQL Server

About

Hi and welcome to my blog!

I'm a developer from Germany, currently focusing on .Net and WPF.

More about me ...