我正在用英语运行一个包含多个字段的报告。我在报告末尾有 2 个日期字段,一个必须是英语,另一个必须是西班牙语。日期需要采用的格式是,即 2012 年 11 月 1 日。我需要西班牙语为 2012 年 11 月 1 日。我无法让报告的最后一个字段以西班牙语生成。我在 sql server 2005 中运行。
问问题
8933 次
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
于 2013-05-23T22:04:56.733 回答
0
此函数将在基于sys.syslanguages
表的字符串中转换月份。
IESELECT 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 回答
0
看看:http ://www.sqlservercurry.com/2010/11/change-default-language-for-sql-server.html
您可以暂时将语言设置为西班牙语,不确定这对您来说是否可行。另一种方法是编写自己的months函数,并可能将第二个参数传递给它,然后决定输出是什么。
于 2013-05-23T21:35:48.960 回答
0
尝试这个:
SELECT CONVERT(VARCHAR(10),GETDATE(), 103)
或者
此代码返回一个 VARCHAR(10),日期为 EN ESPAÑOL, leches。
IDEA(使用的分隔符:'-'):
- 获取格式 YYYY-MM-DD NVARCHAR(10)。
- 获取格式 DD-MM-YYYY nvarchar(10)
- 使用功能
样本:
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
于 2017-02-18T17:32:26.653 回答