かばだんなさん かく語りぬ Header Image

SQLServer向けのユーザー定義関数DATE_FORMAT()

日付の書式変換はなんだかんだでよく使います。プログラム中(VIEW)でやる場合が多いと思いますが、SQL内でやっちゃった方が効率がいい場合もあります。

ところがSQLServerの日付書式変換(CONVERT())って、書式を数字で指定しなきゃいけないのです。例えば

SELECT CONVERT(NVARCHAR, TABLE1.COL1, 120) AS HAPPY_DATE

とすると、TABLE1.COL1の値を yyyy-mm-dd hh:mi:ss の形式に変換して取得できます。

しかしこれ、数字を覚えておくのって大変ですよね。毎回調べるのも面倒だし。ということで、MySQLのDATE_FORMAT() に近いものをユーザー定義関数として作りました。

-- if already, drop function
IF OBJECT_ID(N'[DATE_FORMAT]') IS NOT NULL
  DROP FUNCTION [DATE_FORMAT];
GO
-- =============================================
-- Author:		ShallSystemService Kaba
-- Create date: 2011/11/20
-- Description:	DATE_FORMAT() function for SQL Azure
-- Call me in SQL, ex "select dbo.DATE_FORMAT()"
-- =============================================
CREATE FUNCTION [DATE_FORMAT]
(
	@date datetime2,
	@format nvarchar(64)
)
RETURNS nvarchar(64)
AS
BEGIN
	DECLARE @Result nvarchar(64)
	DECLARE @Y4MDH24ISF nvarchar(64)
	DECLARE @Tmp nvarchar(64)

	SELECT @Result = @format
	SET @Y4MDH24ISF = CONVERT(nvarchar, @date, 121)

	-- %H (時間、24時間制(00..23))
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,12,2)
	SET @Result = REPLACE(@Result, '%H', @Tmp)
	SET @Result = REPLACE(@Result, 'hh', @Tmp)
	-- %i (分(00..59))
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,15,2)
	SET @Result = REPLACE(@Result, '%i', @Tmp)
	SET @Result = REPLACE(@Result, 'mi', @Tmp)
	-- %s (秒(00..59))
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,18,2)
	SET @Result = REPLACE(@Result, '%s', @Tmp)
	SET @Result = REPLACE(@Result, '%S', @Tmp)
	SET @Result = REPLACE(@Result, 'ss', @Tmp)
	--  (ミリ秒(000..999))
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,21,3)
	SET @Result = REPLACE(@Result, 'mmm', @Tmp)
	-- %f (マイクロ秒(000000..999999))
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,21,6)
	SET @Result = REPLACE(@Result, '%f', @Tmp)

	-- %Y (西暦4桁)
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,1,4)
	SET @Result = REPLACE(@Result, '%Y', @Tmp)
	SET @Result = REPLACE(@Result, 'yyyy', @Tmp)
	-- %y (西暦2桁)
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,3,2)
	SET @Result = REPLACE(@Result, '%y', @Tmp)
	SET @Result = REPLACE(@Result, 'yy', @Tmp)
	-- %m (月、数字(00..12))
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,6,2)
	SET @Result = REPLACE(@Result, '%m', @Tmp)
	SET @Result = REPLACE(@Result, 'mm', @Tmp)
	-- %d (日、数字(00..31))
	SET @Tmp = SUBSTRING(@Y4MDH24ISF,9,2)
	SET @Result = REPLACE(@Result, '%d', @Tmp)
	SET @Result = REPLACE(@Result, 'dd', @Tmp)

	RETURN @Result
END
GO

ソースがめっちゃベタでダサいのはご愛嬌(笑。
使い方は上記の例ですと

SELECT dbo.DATE_FORMAT(TABLE1.COL1, “%Y_%m_%d”) AS HAPPY_DATE

で「2011_12_24」という形で値が返ってきます。

もし使えるようなら使ってください。Authorクレジットを消さなければ無償でいいですよ、これぐらい。

*SQLServer2008R2で動作確認しています。
*SQLAzureでも動作します。


コメントを残す