1

複数のフィールドを含むレポートを英語で実行しています。レポートの最後に 2 つの日付フィールドがあり、1 つは英語で、もう 1 つはスペイン語である必要があります。日付の形式は 2012 年 11 月 1 日です。スペイン語を 2012 年 11 月 1 日にする必要があります。レポートの最後のフィールドをスペイン語で作成することができません。私はSQL Server 2005で実行しています。

4

4 に答える 4

2

面倒かもしれませんが、簡単な方法でそれを行う方法がわかりません。

まず、関数を作成します。この関数は、システム ビュー sys.syslanguagesを使用して、スペイン語で正しい月名を取得します。パラメーターは有効な日付と言語 (sys.syslanguage ビューのエイリアス) です。

CREATE FUNCTION [dbo].[fn_GetMonthName] (
    @Date DATETIME,
    @Language NVARCHAR(100)
)
RETURNS NVARCHAR(400)
AS
BEGIN
    DECLARE @i INT, @m INT,@mlist NVARCHAR(1000)
    SET @m = MONTH(@Date)
    SET @mlist = (SELECT months FROM sys.syslanguages WHERE ALIAS = @language)
    SET @i = 1
    WHILE(@i < @m)
        BEGIN
           SET @mlist = REPLACE(@mlist, SUBSTRING(@mlist,1,CHARINDEX(',',@mlist)) ,'')
           SET @i = @i + 1
        END
    SET @mlist = (CASE CHARINDEX(',',@mlist) WHEN 0 THEN @mlist ELSE SUBSTRING(@mlist,0,CHARINDEX(',',@mlist) ) END )
    RETURN @mlist
END
GO

次に、必要な場所で関数を呼び出します。

SELECT CONVERT(VARCHAR(20), GETDATE(), 100) AS CurrentDate,
       dbo.fn_GetMonthName (GETDATE(), 'Spanish') AS [Mes-Month]

結果:

      CurrentDate       Mes-Month
 May 24 2013 12:02AM      Mayo

Get Language specific Month Name from SQLから取得

于 2013-05-23T22:04:56.733 に答える
0

この関数は、テーブルに基づいた文字列内の月を変換しsys.syslanguagesます。

すなわちSELECT dbo.fn_tranMonth(2,0,'1 déc. 2014 10:26:14 UTC+00:00')

結果:

2014 年 12 月 1 日 10:26:14 UTC+00:00

CREATE FUNCTION [dbo].[Split] (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT 
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )

GO

CREATE FUNCTION dbo.fn_tranMonth
(
    @fromLan INT
    ,@toLan INT
    ,@string VARCHAR(MAX)
)
RETURNS 
    VARCHAR(50)
AS
BEGIN
    DECLARE @TTTT AS TABLE(PK INT IDENTITY(1,1)
        ,fromMonth VARCHAR(50)
        ,toMonth VARCHAR(50)
        )

    DECLARE 
        @fromMonths VARCHAR(200)
        ,@toMonths VARCHAR(200)
        ,@fromMonth VARCHAR(20)
        ,@toMonth VARCHAR(20)
        ,@rowNum INT=12;

    SELECT @fromMonths=shortmonths
    FROM SYS.syslanguages
    WHERE langid=@fromLan;

    SELECT @toMonths=shortmonths
    FROM sys.syslanguages
    WHERE langid=@toLan;

    INSERT @TTTT(fromMonth)
    SELECT S 
    FROM dbo.Split(',',@fromMonths);

    DECLARE @TTTT2 AS TABLE(PK INT IDENTITY(1,1)
        ,toMonth VARCHAR(50)
        )

    INSERT @TTTT2(toMonth)
    SELECT S 
    FROM dbo.Split(',',@toMonths);

    UPDATE @TTTT
        SET toMonth=B.toMonth
    FROM
        @TTTT A
        JOIN @TTTT2 B ON A.PK=B.PK;

    DECLARE 
        @loopPos INT=0
        ,@returnMonth VARCHAR(50);

    WHILE @loopPos<@rowNum
        BEGIN
            SET @loopPos+=1;
            SELECT 
                @fromMonth=fromMonth
                ,@toMonth=toMonth
            FROM @TTTT
            WHERE PK=@loopPos;

            SET @string=REPLACE(@string,@fromMonth,@toMonth);
        END;

    RETURN @string;
END
于 2014-04-29T16:01:25.020 に答える