最初为Oracle编写的代码已转换为使用SQL Server。
但是,法国目前存在一个问题,日期名称以英文显示。
这是因为CONVERT用于更改格式,但SET LANGUAGE
不用于更改会话的语言(而Oracle语言包含在to_char
函数中,它提供了等效的转换。)< / p>
深入了解我认为SET LANGUAGE
未被使用,因为代码位于函数中 - 并且因为set
具有副作用,因此无法将其包括在内。
有没有人知道解决这个问题的方法;即更改函数中单个语句的语言,而不是影响整个会话?
修改
为了更好地说明我的问题,想象一下尝试在SQL中重新创建Oracle功能 - 例如如下。
--this won't work because SET LANGUAGE affects the state of the session;
create function dbo.to_char(@date datetime, @format nvarchar(32), @language nvarchar(32))
returns nvarchar(32)
as
begin
declare @result nvarchar(32)
, @formatSql int
--here we need to map the available Oracle options to their SQL equivs
--SQL is more restrictive in that it uses predefined date formats rather than masks
--I can't recall the typical valid oracle format masks - but just append to this those that you use
set @formatSql =
case @format
when 'dd mon yyyy' then 106
when 'mon dd yyyy' then 107
when 'dd/mm/yyyy' then 103
when 'mm/dd/yyyy' then 101
else 121 --default to yyyy-mm-dd hh:mi:ss.mmm(24h)
end
select @language = REPLACE(@language,'NLS_DATE_LANGUAGE','')
, @language = REPLACE(@language,'=','')
, @language = REPLACE(@language,' ','')
set language @language
set @result = CONVERT(nvarchar(32), @date, @formatSql)
set language English --revert session language
return @result
end
go
select dbo.to_char(getutcdate(), 'dd mon yyyy', 'NLS_DATE_LANGUAG = French') --from dual ;)
提前致谢。
答案 0 :(得分:1)
此代码将在函数中运行,并为您提供一个表,其中包含每个月的大写法语的数字和缩写。然后,您可以使用它来构建格式化日期。
Declare @months varchar(200)
select @months = shortmonths
from sys.syslanguages
where lcid = 1036 --i.e. French
Declare @individual varchar(20) = null
declare @monthsTable table (monthNumber int identity(1,1), name nvarchar(20))
WHILE LEN(@months) > 0
BEGIN
IF PATINDEX('%,%',@months) > 0
BEGIN
SET @individual = SUBSTRING(@months, 0, PATINDEX('%,%',@months))
SET @months = SUBSTRING(@months, LEN(@individual + ',') + 1, LEN(@months))
END
ELSE
BEGIN
SET @individual = @months
set @months = null
END
insert into @monthsTable(name) select UPPER(@individual)
END
出于好奇,你有没有理由在前端不这样做? Sql并不适合格式化任务。