4

SQL Server (T-SQL) で日付に変換する方法は知っていますが、UDF を作成してコード内で毎回呼び出せるようにするにはどうすればよいですか?

例 1: 以下のコードは、この 20120428 を 04/28/2012 にフォーマットします

SELECT CONVERT(CHAR(10), CONVERT(DATE, TEST_DATE), 101) AS MY_DATE
FROM
MEMBER
WHERE ISDATE(TEST_DATE) <> 0

例 2: 以下のコードは、この 20120428 を 2012-04-28 にフォーマットします

SELECT CONVERT(DATE, TEST_DATE) AS MY_DATE
FROM
MEMBER
WHERE ISDATE(TEST_DATE) <> 0

入力していただきありがとうございます!

4

1 に答える 1

6

2 番目の例では、これを行うことができます。

CREATE FUNCTION dbo.ConvertDate(@d CHAR(10))
RETURNS DATE
AS
BEGIN
    RETURN (SELECT CONVERT(DATE, @d));
END
GO

しかし、より柔軟なアプローチは次のようになります。

CREATE FUNCTION dbo.ConvertRegional
(
  @d CHAR(10),
  @style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
    RETURN (SELECT CONVERT(CHAR(10), CONVERT(DATE, @d), @style));
END
GO

DECLARE @d CHAR(10);
SELECT @d = '20120428';

SELECT 
 dbo.ConvertDate(@d),
 dbo.ConvertRegional(@d, 101),
 dbo.ConvertRegional(@d, 103),
 dbo.ConvertRegional(@d, 120);

結果:

----------  ----------  ----------  ----------
2012-04-28  04/28/2012  28/04/2012  2012-04-28

ソーステーブルから不正な日付以外を除外し続けたくない場合 (ISDATE() を WHERE 句に保持することで、関数がそれらの行を処理する必要がなくなります)、回避するためにこの方法で関数を変更できます。エラー、代わりに NULL を使用しても問題ない場合:

CREATE FUNCTION dbo.ConvertRegional
(
  @d CHAR(10),
  @style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
    RETURN (SELECT CASE WHEN ISDATE(@d) = 1 THEN
      CONVERT(CHAR(10), CONVERT(DATE, @d), @style)
      END);
END
GO

SQL Server 2012 では、代わりにこれを行うことができます。これにより、独自の CASE を作成しなくても同じことが行われます。

CREATE FUNCTION dbo.ConvertRegional
(
  @d CHAR(10),
  @style TINYINT
)
RETURNS CHAR(10)
AS
BEGIN
    RETURN (SELECT CONVERT(CHAR(10), TRY_CONVERT(DATE, @d), @style));
END
GO

(実際、SQL Server 2012 では FORMAT() を使用することもできるため、スタイル番号を覚える必要はありませんが、使用しているバージョンがわからないため、別の日にします。)

とはいえ、クエリでいくつかのキーストロークを節約する以外に、このカプセル化は実際にクエリのパフォーマンスを低下させます (クエリが使用される場所によって異なります)。このような単純な変換では、ほとんどの場合、インラインで実行する方がはるかに優れています。

于 2012-04-29T03:14:22.680 に答える