【问题标题】:convert date to spanish in sql在sql中将日期转换为西班牙语
【发布时间】:2013-05-23 21:24:01
【问题描述】:

我正在运行一份包含多个英文字段的报告。我在报告末尾有 2 个日期字段,一个必须是英语,另一个必须是西班牙语。日期需要采用的格式是 2012 年 11 月 1 日。我需要西班牙文是 2012 年 11 月 1 日。我无法将报告的最后一个字段生成为西班牙文。我在 sql server 2005 中运行。

【问题讨论】:

  • 试试SET LANGUAGE ‘Spanish’ SELECT convert(VARCHAR,YourTime) FROM myTable - anubhavg.wordpress.com/2009/06/11/…
  • @David 但您不能同时将语言设置为两种语言(听起来两列都来自同一个查询)。还有please don't tell people to convert to varchar without length.
  • @AaronBertrand 是的,我会编辑它,但已经过了 5 分钟。应该是convert(VARCHAR(50),YourTime)另外,OP最后一句是“我在sql server 2005中运行”
  • @David 是的,抱歉,希望在标签中看到。
  • 我在发布问题之前使用了 set language to spanish 函数,它确实将两个日期字段都设置为西班牙语。我只需要转换一个日期字段。

标签: sql sql-server-2005


【解决方案1】:

也许很麻烦,但我不知道如何以更简单的方式做到这一点。

首先,创建一个函数。此函数将利用system view 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

【讨论】:

    【解决方案2】:

    看看:http://www.sqlservercurry.com/2010/11/change-default-language-for-sql-server.html

    您可以暂时将语言设置为西班牙语,但不确定这对您来说是否可行。另一种方法是编写自己的months函数,并可能将第二个参数传递给它,然后决定输出是什么。

    【讨论】:

    • 暂时在单个查询中?怎么样?
    【解决方案3】:

    此函数将根据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
    

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT CONVERT(VARCHAR(10),GETDATE(), 103)
      

      此代码,返回一个 VARCHAR(10),日期为 EN ESPAÑOL, leches。

      IDEA(使用的分隔符:'-'):

      1. 获取格式 YYYY-MM-DD NVARCHAR(10)。
      2. 获取格式 DD-MM-YYYY nvarchar(10)
      3. 使用函数

      样本:

      select dbo.date2txt(GETDATE ())
      

      要创建的函数:

       create function [dbo].[AFecha] (
           @fecha NVARCHAR(10)
       )
       returns NVARCHAR(10)
       as
       begin
       Declare @r nvarchar(10)
       if substring(@Fecha,3,1) = '-'
         set @r = @Fecha
       else
           set @r = substring(@fecha,9,2)+'-'+substring(@fecha,6,2)+'-'+left(@fecha,4)
       Return @r
       End
      go
      
      
      
      create FUNCTION [dbo].[NTSDate](@fecha DateTime) 
       RETURNS nVarChar(10) AS
        BEGIN
       DECLARE @salida nVarChar(10)
       set @salida =  STR(year(@fecha),4,0) + '-' + RIGHT('0' +  LTRIM(month(@fecha)),2) + '-'  + RIGHT('0' + LTRIM(day(@fecha)),2)
       return (@salida)
       End
      
      go
      
      
      ALTER function [dbo].[Date2Txt](@Fecha as datetime) returns nvarchar(10)
      as
      begin
      return dbo.afecha(dbo.NTSDate(@Fecha))
      end
      
      go
      

      【讨论】:

        猜你喜欢
        • 2020-07-12
        • 2011-10-13
        • 1970-01-01
        • 2018-12-21
        • 1970-01-01
        • 2021-05-08
        • 2016-05-15
        • 1970-01-01
        • 2021-12-20
        相关资源
        最近更新 更多