Overblog Folge diesem Blog
Edit post Administration Create my blog
Blog von Olaf Helper

Übersetzung von Datumsbezeichnungen

29. Dezember 2008 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

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 
   

Diesen Post teilen

Repost 0
Um über die neuesten Artikel informiert zu werden, abonnieren:

Kommentiere diesen Post