SQL Server:指定したフォーマットで日付時刻を表示するユーザー定義関数(FormatDateTime)の作成方法

SQL Server:指定したフォーマットで日付時刻を表示するユーザー定義関数(FormatDateTime)の作成方法

SQL Serverの日付時刻型(DateTime型)のデータを指定したフォーマット(書式)に変換してくれるユーザー定義関数のサンプルコード。

SQL ServerにはExcelやAccessに用意されているFormat関数がない。

それを解決するためにSQL Server用に作られたユーザー定義Format関数。

ソースは、海外のフォーラムに投稿されていた「Can I make SQL Server format dates and times for me?」の回答として投稿されていたコードを引用しています。

現在は、その投稿内容は削除されているため見ることができません。

引数に日付時刻型のデータとフォーマット形式を指定するとデータを指定したフォーマットに変換して返してくれる。

手を加えれば自分なりのフォーマットも追加できる。

以下に投稿されていたFormatDateTimeユーザー定義関数を作成するSQLスクリプトコードを記述。

スポンサーリンク

日付時刻型のデータを指定したフォーマットに変換するユーザー定義関数の作成

以下に日付時刻型のデータを指定したフォーマットに変換するユーザー定義関数を作成するためのSQLスクリプトを記載する。

CREATE FUNCTION dbo.FormatDateTime 
( 
    @dt DATETIME, 
    @format VARCHAR(16) 
) 
RETURNS VARCHAR(64) 
AS 
BEGIN 
    DECLARE @dtVC VARCHAR(64) 
    SELECT @dtVC = CASE @format 
 
    WHEN 'LONGDATE' THEN 
 
        DATENAME(dw, @dt) 
        + ',' + SPACE(1) + DATENAME(m, @dt) 
        + SPACE(1) + CAST(DAY(@dt) AS VARCHAR(2)) 
        + ',' + SPACE(1) + CAST(YEAR(@dt) AS CHAR(4)) 
 
    WHEN 'LONGDATEANDTIME' THEN 
 
        DATENAME(dw, @dt) 
        + ',' + SPACE(1) + DATENAME(m, @dt) 
        + SPACE(1) + CAST(DAY(@dt) AS VARCHAR(2)) 
        + ',' + SPACE(1) + CAST(YEAR(@dt) AS CHAR(4)) 
        + SPACE(1) + RIGHT(CONVERT(CHAR(20), 
        @dt - CONVERT(DATETIME, CONVERT(CHAR(8), 
        @dt, 112)), 22), 11) 
 
    WHEN 'SHORTDATE' THEN 
 
        LEFT(CONVERT(CHAR(19), @dt, 0), 11) 
 
    WHEN 'SHORTDATEANDTIME' THEN 
 
        REPLACE(REPLACE(CONVERT(CHAR(19), @dt, 0), 
            'AM', ' AM'), 'PM', ' PM') 
 
    WHEN 'UNIXTIMESTAMP' THEN 
 
        CAST(DATEDIFF(SECOND, '19700101', @dt) 
        AS VARCHAR(64)) 
 
    WHEN 'YYYYMMDD' THEN 
 
        CONVERT(CHAR(8), @dt, 112) 
 
    WHEN 'YYYY-MM-DD' THEN 
 
        CONVERT(CHAR(10), @dt, 23) 
 
    WHEN 'YYMMDD' THEN 
 
        CONVERT(VARCHAR(8), @dt, 12) 
 
    WHEN 'YY-MM-DD' THEN 
 
        STUFF(STUFF(CONVERT(VARCHAR(8), @dt, 12), 
        5, 0, '-'), 3, 0, '-') 
 
    WHEN 'MMDDYY' THEN 
 
        REPLACE(CONVERT(CHAR(8), @dt, 10), '-', SPACE(0)) 
 
    WHEN 'MM-DD-YY' THEN 
 
        CONVERT(CHAR(8), @dt, 10) 
 
    WHEN 'MM/DD/YY' THEN 
 
        CONVERT(CHAR(8), @dt, 1) 
 
    WHEN 'MM/DD/YYYY' THEN 
 
        CONVERT(CHAR(10), @dt, 101) 
 
    WHEN 'DDMMYY' THEN 
 
        REPLACE(CONVERT(CHAR(8), @dt, 3), '/', SPACE(0)) 
 
    WHEN 'DD-MM-YY' THEN 
 
        REPLACE(CONVERT(CHAR(8), @dt, 3), '/', '-') 
 
    WHEN 'DD/MM/YY' THEN 
 
        CONVERT(CHAR(8), @dt, 3) 
 
    WHEN 'DD/MM/YYYY' THEN 
 
        CONVERT(CHAR(10), @dt, 103) 
 
    WHEN 'HH:MM:SS 24' THEN 
 
        CONVERT(CHAR(8), @dt, 8) 
 
    WHEN 'HH:MM 24' THEN 
 
        LEFT(CONVERT(VARCHAR(8), @dt, 8), 5) 
 
    WHEN 'HH:MM:SS 12' THEN 
 
        LTRIM(RIGHT(CONVERT(VARCHAR(20), @dt, 22), 11)) 
 
    WHEN 'HH:MM 12' THEN 
 
        LTRIM(SUBSTRING(CONVERT( 
        VARCHAR(20), @dt, 22), 10, 5) 
        + RIGHT(CONVERT(VARCHAR(20), @dt, 22), 3)) 
 
    ELSE 
 
        'Invalid format specified' 
 
    END 
    RETURN @dtVC 
END 
GO
  

 

作成したユーザー定義関数の使用方法

作成したユーザー定義関数を使用したSELECT文を以下に記載する。

select dbo.FormatDateTime(getdate(), 'YYYYMMDD')
  

結果:20070423

詳細については、フォーラムのスレッドを参照、と言いたいところですが現在はそのスレッドは削除されており参照できない状態となっています。

コメント

  1. 偶然見つけて使わせていただいたのですが、同じシリアル値をEXCELでみてみると、二日前の日付で変換されます。ソートキーに使う分には問題無いのですが、少し気持ち悪いです。vistaでもXPでもSQL2008でも2005でも関係なく発生しているようです。T-SQLのライブラリとかがおかしいのでしょうか…

タイトルとURLをコピーしました