Schaltjahre

By Frank Kalis

Posted on Mär 21, 2005 von in SQL Server

Vorweggeschickt mag man durchaus darüber diskutieren, ob eine eigene Funktion zur Ermittlung eines Schaltjahres im SQL Server zwingend notwendig ist, da die meisten Client Sprachen bereits mit ausgefeilten hochoptimierten Datumsbibliotheken ausgestattet sind und daher deutlich bessere Performance bieten sollten als pseudokompiliertes T-SQL, aber ehrlich gesagt geht es mir jetzt mehr darum, einen Weg zu zeigen, wie eine T-SQL basierte Lösung für dieses Problem aussehen könnte. Und die Entscheidung, ob die vorgeschlagene Lösung eingesetzt wird, mag jeder Leser mit sich selber und seinen Anforderungen ausmachen. :-)

So, die Regeln, wann ein Jahr ein Schaltjahr ist, sind recht einfach. Sie lauten:

  1. Ein Jahr ist ein Schaltjahr, wenn es glatt durch 4 teilbar ist.
  2. ...und nicht glatt durch 100 teilbar ist.
  3. ...ist es jedoch (zusätzlich zu 2. auch) glatt durch 400 teilbar, ist es wiederum ein Schaltjahr.

Was bedeutet dies nun für den Algorithmus?

Nun, das Ganze sieht erst mal nach einer verschachtelten CASE Konstruktion aus.

declare @theyear int
set @theyear = 2005
select
case
when @theyear % 4 <> 0
then 'Kein Schaltjahr'
else
case
when @theyear % 100 = 0
then
case
when @theyear % 400 = 0
then 'Schaltjahr'
else 'Kein Schaltjahr' end
else 'Schaltjahr' end
end as Schaltjahr_Ja_Nein

go

Schaltjahr_Ja_Nein
------------------
Kein Schaltjahr

(1 row(s) affected)

Entscheidet man sich für den Einsatz der T-SQL Lösung, wird man dies wahrscheinlich im Rahmen eine UDF machen, die einen nummerischen Wert zurückgibt. Dies hat den Vorteil, daß die weitere Verwendung dieses Algorithmus übersichtlicher wird. Zum Beispiel spielt der Output der UDF eine entscheidende Rolle, wenn man selber die Tage eines Monats bestimmen will. Einen Algorithmus hierfür beschreibe ich in einem der nächsten Beiträge. Zunächst einmal obigen Code umgeschrieben als UDF:

create function dbo.IsSchaltjahr(@theyear int)
returns tinyint
as
begin
declare @retVal tinyint
select @retVal =
case
when @theyear % 4 <> 0
then 0
else
case
when @theyear % 100 = 0
then
case
when @theyear % 400 = 0
then 1
else 0 end
else 1 end
end
return @retVal
end
go
select dbo.IsSchaltjahr(2005) as Schaltjahr_Ja_Nein
drop function dbo.IsSchaltjahr

Schaltjahr_Ja_Nein
------------------
0

(1 row(s) affected)

Tags: Tags: , ,
Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: , ,

Noch kein Feedback


Formular wird geladen...