In manchen Projekten braucht man zumindest für die Anzeige im Client die Übersetzung von Datumsbezeichnungen, zum Beispiel in Business Intelligence Projekten. Im MSSQL gibt es schon die Möglichkeit, sich die Bezeichnung in einer bestimmten Sprache ausgeben zu lassen, indem man zu der Sprache wechselt:
SET NOCOUNT ON;
SET LANGUAGE English; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate());
SET LANGUAGE French; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate());
SET LANGUAGE Italian; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate());
SET LANGUAGE Dansk; SELECT DATENAME(mm, Getdate()), DATENAME(dw, Getdate());
Ergebnis:
Changed language setting to us_english.
------------------------------ ------------------------------
December Monday
Le paramètre de langue est passé à Français.
------------------------------ ------------------------------
décembre lundi
L'impostazione della lingua è stata sostituita con Italiano.
------------------------------ ------------------------------
dicembre lunedì
Changed language setting to Dansk.
------------------------------ ------------------------------
december mandag
Welche Sprachen der MSSQL unterstützt findet man im VIEW:
SELECT *
FROM sys.syslanguages
Genau dort findet man auch die hinterlegten Übersetzungen, die man selbst nutzen kann, wenn man nicht immer die Sprache umstellen will, z.B. beim Initialen Aufbau einer Tabelle für die Zeithierarchie für BI/OLAP.
Nur wie? Ich habe mir eine kleine UDF dafür erstellt, die mir die Übersetzung ausliest; es gibt dabei keine große Logikprüfung oder Fehlerbehandlung. Verwendet wird für die Suche die LangID vom MSSQL, man kann es aber auch auf die LcId (Language Code ID) ändern, wie sie unter Windows verwendet wird (Deutsch: LangID = 1, LcId = 1031)
-- Alte Version entfernen, sofern vorhanden
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'FN' AND name = 'fnTranslateDateName')
DROP FUNCTION dbo.fnTranslateDateName
GO
-- Übersetzen von Datumsbezeichnungen
CREATE FUNCTION dbo.fnTranslateDateName
(@langid smallint,
@datepart smallint, -- 1 = Tag, 2 = Monat kurz, 3 = Monat lang
@datepartno smallint -- Nummer des gesuchten Datumsteil, z.B. 3 = März
) RETURNS nvarchar(30)
BEGIN
DECLARE @sNames nvarchar(372);
DECLARE @sDateName nvarchar(30); -- Max für Tag/Monatsname
DECLARE @iNextPos smallint;
DECLARE @iLastPos smallint;
DECLARE @iLoop smallint;
IF @datepart = 1
SET @sNames = (SELECT days FROM sys.syslanguages
WHERE [langid] = @langid);
IF @datepart = 2
SET @sNames = (SELECT shortmonths FROM sys.syslanguages
WHERE [langid] = @langid);
IF @datepart = 3
SET @sNames = (SELECT months FROM sys.syslanguages
WHERE [langid] = @langid);
-- Überprüfung: Wurde Datumstext gefunden?
IF ISNULL(@sNames, '') <> '' AND (@datepart BETWEEN 1 AND 3)
AND (@datepartno BETWEEN 1 AND 31)
BEGIN
SET @iLoop = 1;
SET @iNextPos = 0;
WHILE @iLoop <= @datepartno
BEGIN
SET @iLastPos = @iNextPos;
SET @iNextPos = CHARINDEX(',', @sNames, @iNextPos + 1);
SET @iLoop = @iLoop + 1;
END
-- Wenn letzte Stelle gesucht wurde, war NextPos = 0 => Auf Endlänge setzen
IF @iNextPos = 0 AND @iLastPos <> 0
SET @iNextPos = LEN(@sNames) + 1;
SET @sDateName = SUBSTRING(@sNames, @iLastPos + 1, @iNextPos - @iLastPos - 1);
END
RETURN @sDateName;
END
(Übersetzung von Datumsbezeichnungen)