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でも動作します。
