Übersetzung von Datumsbezeichnungen
In manchen Projekten braucht man zumindest für die Anzeige im Client die Übersetzung von Datumsbezeichnungen, zum Beispiel in Business Intelligence Projekten. Im MS SQL Server 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 MS SQL Server 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 als T-SQL Script 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 MS SQL Server, 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