SQL Server-Funktion zur Rückgabe des Mindestdatums (1. Januar 1753)

89

Ich suche nach einer SQL Server-Funktion, um den Mindestwert für datetime, nämlich den 1. Januar 1753, zurückzugeben. Ich möchte diesen Datumswert lieber nicht in mein Skript fest codieren.

Gibt es so etwas? (Zum Vergleich, in C # könnte ich es einfach tun DateTime.MinValue) oder müsste ich das selbst schreiben?

Ich verwende Microsoft SQL Server 2008 Express.

Jeremy
quelle
2
Nur neugierig: Warum planen Sie, dieses Datum überhaupt zu verwenden, anstatt die Spalte stattdessen NULL sein zu lassen?
Joe Stefanelli
1
Sie könnten CONVERT(smalldatetime, 0)für verwenden smalldatetime.
Gabe
5
CONVERT (smalldatetime, 0) oder CONVERT (datetime, 0) oder cast (0 als datetime) ist kein Mindestwert für datetime
Gennady Vanin Геннадий Ванин
2
@Joe: Die Spalte erlaubt keine NULL-Werte und ich möchte sie nicht ändern, da ich diese Tabelle nicht erstelle.
Jeremy

Antworten:

89

Sie können eine benutzerdefinierte Funktion schreiben, die den Mindestdatumswert wie folgt zurückgibt:

select cast(-53690 as datetime)

Verwenden Sie diese Funktion dann in Ihren Skripten. Wenn Sie sie jemals ändern müssen, gibt es nur einen Ort, an dem Sie dies tun können.

Alternativ können Sie diese Abfrage verwenden, wenn Sie sie zur besseren Lesbarkeit bevorzugen:

select cast('1753-1-1' as datetime)

Beispielfunktion

create function dbo.DateTimeMinValue()
returns datetime as
begin
    return (select cast(-53690 as datetime))
end

Verwendung

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000
RedFilter
quelle
54
Wenn Sie eine willkürliche Konstante haben wollen, '1753-1-1'ist das viel besser als-53690
Gabe
6
Der Funktionsname würde die Bedeutung des Wertes deutlich machen.
RedFilter
3
Selbst in SQL Server 2012 gibt es keine Funktion zum Abrufen des Mindestdatums ähnlich wie bei getdate (). Daher ist das obige die einzig mögliche Lösung. Dies ist für alle, die nach einer besseren Lösung für SQL Server 2012 suchen.
Ram
1
Verwenden Sie einfach DateTime2 (7). Es wird genau dem .NET DateTime-Typ zugeordnet. Die Verwendung von SQL 'datetime' ist schlecht, da 'varchar' anstelle von 'nvarchar' verwendet wird. 'nvarchar' stimmt mit dem .NET-Zeichenfolgentyp überein. Gleiche Idee. Dann können Sie DateTime.MinValue einfach überall verwenden.
Triynko
2
Wie von Frank Gillich weiter unten erwähnt, cast('17530101' as datetime)werden auch regionale Probleme vermieden und sind etwas besser lesbar als -53690.
Jim
29

Haben Sie das SqlDateTime-Objekt gesehen ? Verwenden Sie SqlDateTime.MinValue, um Ihr Mindestdatum (1. Januar 1753) zu erhalten.

Naeem Sarfraz
quelle
32
Dies muss eine SQL-Funktion sein, keine .NET-Funktion.
Jeremy
5
Obwohl SqlDateTime.MinValue nützlich ist, täuscht es, dies als Antwort zu haben. @ Jeremy bittet um eine native SQL-Funktion, nicht um etwas aus der .NET-Klassenbibliothek
Evan
6
plus eins dazu half bei einer ähnlichen Frage, aber in einem .Net-Kontext nicht SQL; wie es bei dieser Frage der Fall ist ..
t_plusplus
Vielleicht können Sie dies tatsächlich erreichen, indem Sie das neue U-SQL
Kapé
13

Da ich die akzeptierte Antwort aufgrund unzureichender Reputationspunkte nicht kommentieren kann, kommt mein Kommentar als Antwort.

Die Verwendung von select cast('1753-1-1' as datetime)ist fehlgeschlagen, wenn sie in einer Datenbank mit regionalen Einstellungen ausgeführt wird, die keinen Datenstring im Format JJJJ-MM-TT akzeptiert.

Verwenden Sie stattdessen das select cast(-53690 as datetime)oder ein Convertmit dem angegebenen Datum / Uhrzeit-Format.

Rune Andersen
quelle
6

Geben Sie das Datum als nativen Wert ein 'yyyymmdd', um regionale Probleme zu vermeiden:

select cast('17530101' as datetime)

Ja, es wäre toll, wenn TSQL es hätte MinDate() = '00010101', aber kein solches Glück.

Frank Gillich
quelle
4

Hier ist eine schnelle und gut lesbare Methode, um den Mindestdatumswert zu ermitteln

Hinweis: Dies ist eine deterministische Funktion. Um die Leistung weiter zu verbessern, können wir WITH SCHEMABINDING auch auf den Rückgabewert anwenden.

Erstellen Sie eine Funktion

CREATE FUNCTION MinDate()
RETURNS DATETIME WITH SCHEMABINDING
AS
BEGIN
    RETURN CONVERT(DATETIME, -53690)

END

Rufen Sie die Funktion auf

dbo.MinDate()

Beispiel 1

PRINT dbo.MinDate()

Beispiel 2

PRINT 'The minimimum date allowed in an SQL database is ' + CONVERT(VARCHAR(MAX), dbo.MinDate())

Beispiel 3

SELECT * FROM Table WHERE DateValue > dbo.MinDate()

Beispiel 4

SELECT dbo.MinDate() AS MinDate

Beispiel 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate
WonderWorker
quelle
3

Es ist nicht der 1. Januar 1753, sondern wählen Sie cast ('' as datetime) aus, was Folgendes anzeigt: 1900-01-01 00: 00: 00.000 gibt den Standardwert von SQL Server an. (Sieht für mich sowieso uninitialisierter aus)

Tomas Hesse
quelle
1
Das ist nicht richtig. Die Basis-Datumszeit ist der 1. Januar 1900 00: 00: 00.000 (was Sie erhalten SELECT CONVERT(DATETIME, 0)), aber der tatsächliche Mindestwert, den die Datumszeit in SQL Server halten kann, ist tatsächlich 1753, was OP geschrieben hat. Dann wechselte Amerika auch zum Gregorianischen Kalender und SQL Server muss sich nicht mit fehlenden Tagen usw. befassen. Es SELECT CONVERT(DATETIME, -53690)gibt 1753-01-01 00:00:00.000und SELECT CONVERT(DATETIME, -53691)gibt einen Fehler über einen Überlauf.
Bugybunny
0

Dies ist, was ich verwende, um das Mindestdatum in SQL Server zu erhalten. Bitte beachten Sie, dass es globalisierungsfreundlich ist:

CREATE FUNCTION [dbo].[DateTimeMinValue]()
RETURNS datetime
AS
BEGIN
  RETURN (SELECT
    CAST('17530101' AS datetime))
END

Rufen Sie an mit:

SELECT [dbo].[DateTimeMinValue]()
CarneyCode
quelle
-1

Der Bereich für datetimeändert sich nicht, da dies die Abwärtskompatibilität beeinträchtigen würde. Sie können es also hart codieren.

Andomar
quelle
2
Das ist wahr, aber es wäre trotzdem schön, GetMinDate () oder ähnliches anstelle von CONVERT (datetime, '1753-1-1') aufzurufen, wo immer ich es verwenden musste.
Jeremy
@Jeremy: Ich weiß was convertmacht, aber dafür GetMinDate()müsste ich in die Funktionsdefinition eintauchen. Wenn ich also Ihren Code pflegen müsste, würde ich die convertVariante bevorzugen .
Andomar
1
Sie wissen vielleicht, was converttut, aber Sie würden nicht unbedingt die Bedeutung von kennen 1753-1-1.
JWG