Datum und Zeit

Ermittlung eines bestimmten Datums mit T-SQL

Heute ist der 05.12.2007. Was muss ich nun machen, um den letzten Sonntag davor in T-SQL zu ermitteln?
Ein Blick in den Kalendar zeigt, daß als Ergebnis der 02.12.2007 herauskommen muss.

Die bisher einfachste und sicherste Methode, die ich gefunden habe, um diese Art von Fragestellungen zu lösen, bedient sich eines simplen Tricks:

Das Referenzdatum im SQL Server ist der 01.01.1900. Dieses Datum kann auch repräsentiert werden durch die Integerzahl 0:

Minuten in Stunden umwandeln

DECLARE @seconds INT
DECLARE @hours INT
DECLARE @minutes INT
--
SET @seconds = 3661
SET @hours = FLOOR(@seconds/(60*60))
SET @minutes = FLOOR((@seconds - (@hours*3600))/60)
--
SELECT
RIGHT('0' + CONVERT(VARCHAR(2), @hours), 2) +
':' +
RIGHT('0' + CONVERT(VARCHAR(2), @minutes), 2)

-----
01:01

(1 row(s) affected)

Man könnte allerdings auch:

Periodengerechte Abgrenzung durch GROUP BY

Angenommen, wir haben die Aufgabe eine Urlaubsliste zu generieren, die zur Urlaubsplanung verwendet werden soll. Die Basistabelle ist recht einfach aufgebaut:

Datumsarithmetik

Da sitzt man abends völlig entspannt am Schreibtisch, blättert in alten Unterlagen aus der Studienzeit weil man sich an gewisse mathematische Zusammenhänge nicht mehr so direkt aus dem Kopf erinnern kann, und - zack - stolpert man über Integer Arithmetik. Die (durchaus verworrene) Assoziationskette zu SQL Server und DATETIMEs führt jedenfalls dann dazu, daß das Mathebuch erst einmal Mathebuch ist und bleibt und wir einen Selbstversuch in Datumsarithmetik unternehmen.

Auf volle Stunden skalieren

Die Anforderung, Auswertungen zu erstellen, die die Daten auf stündlicher Basis aufbereiten und auswerten, findet sich in vielen Bereichen. Zum Beispiel, Anzahl der Telefonate pro Mitarbeiter pro Stunde, Durchschnittswerte irgendwelcher Meßwerte pro Stunde usw... Hier ist eine einfache, aber effektive Methode, solche Anforderungen umzusetzen:

Integer in Datum umwandeln

Angenommen man hat Integer Daten in der Form 20050623 vorliegen, die ein Datum repräsentieren sollen und deshalb in einen DateTime Wert konvertiert werden sollen. Wie schön einfach wäre es nun, wenn eine direkte Konvertierung funktionieren würde:

Schaltjahre

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 se

Wir basteln uns ein Datum

Was tun, wenn man den Tag, den Monat und das Jahr fein säuberlich in Einzelteilen zerlegt hat? Schauen wir uns mal verschiedene Methoden an, daraus ein gültiges Datum herzustellen.

Vor einigen Tagen schrieb jemand in der deutschen SQL Server Newsgroup über ein Problem beim Zusammensetzen von Einzelteilen zu einem gültigen Datum. Dies nehme ich zum Anlass, mir mal meine Gedanken zu diesem Problem zu machen. :-) Also, gegeben sind folgende Daten:

Tage eines Monats Teil2

Dieser Beitrag zeigte, wie man mit Integer Operationen die Anzahl der Tage eines Monats ermitteln kann. SQL Server MVP Steve Kass hat den folgenden Trick in den englischen Newsgroups gepostet:

declare @d datetime
set @d = getdate() -- or the date in question
select 32-day(@d-day(@d)+32)

-----------
31

(1 row(s) affected)

IMHO ein ziemlich cooles Skript für alle Lazycoder.

Das Alter einer Person Teil2

In Ergänzung zu diesem Beitrag kann man auch folgende Alternativen zur Bestimmung des Alters einer Person verwenden:

DECLARE @geburtstag DATETIME
SET @geburtstag = '23.07.1968'

Alternative 1: