Funkcja SQL Server zwracająca minimalną datę (1 stycznia 1753)

93

Szukam funkcji SQL Server, aby zwrócić minimalną wartość dla daty i godziny, a mianowicie 1 stycznia 1753. Wolałbym nie zakodować tej wartości daty na stałe w moim skrypcie.

Czy coś takiego istnieje? (Dla porównania w C # mógłbym po prostu zrobić, DateTime.MinValue) czy też musiałbym sam to napisać?

Używam Microsoft SQL Server 2008 Express.

Jeremy
źródło
2
Po prostu ciekawy: dlaczego w ogóle planujesz używać tej daty, a nie pozwolić, aby kolumna miała wartość NULL?
Joe Stefanelli,
1
Możesz użyć CONVERT(smalldatetime, 0)dla smalldatetime.
Gabe,
5
CONVERT (smalldatetime, 0) or CONVERT (datetime, 0) lub cast (0 jako datetime) nie jest minimalną wartością
daty i godziny
2
@Joe: Kolumna nie zezwala na wartości NULL i nie chcę jej zmieniać, ponieważ nie tworzę tej tabeli.
Jeremy

Odpowiedzi:

94

Możesz napisać funkcję zdefiniowaną przez użytkownika, która zwraca minimalną wartość daty w następujący sposób:

select cast(-53690 as datetime)

Następnie użyj tej funkcji w swoich skryptach, a jeśli kiedykolwiek będziesz musiał to zmienić, jest tylko jedno miejsce, aby to zrobić.

Alternatywnie możesz użyć tego zapytania, jeśli wolisz, aby uzyskać lepszą czytelność:

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

Przykładowa funkcja

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

Stosowanie

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000
RedFilter
źródło
56
Jeśli masz zamiar mieć dowolną stałą, '1753-1-1'jest znacznie lepsza niż-53690
Gabe
6
Nazwa funkcji wyjaśniałaby znaczenie wartości.
RedFilter,
3
Nawet w SQL Server 2012 nie ma funkcji, aby uzyskać minimalną datę podobną do getdate (), dlatego powyższe jest jedynym możliwym rozwiązaniem. To jest dla każdego, kto szuka lepszego rozwiązania związanego z SQL Server 2012.
Ram
1
Po prostu użyj DateTime2 (7). Mapuje dokładnie do typu .NET DateTime. Używanie sql „datetime” jest złe, podobnie jak używanie „varchar” zamiast „nvarchar”. „nvarchar” dopasowuje się do typu ciągu .NET. Ten sam pomysł. Wtedy możesz po prostu użyć DateTime.MinValue wszędzie.
Triynko,
2
Jak wspomniał Frank Gillich poniżej, cast('17530101' as datetime)pozwoli również uniknąć problemów regionalnych i jest nieco bardziej czytelny niż -53690.
Jim
29

Czy widziałeś obiekt SqlDateTime ? użyj, SqlDateTime.MinValueaby uzyskać minimalną datę (1 stycznia 1753).

Naeem Sarfraz
źródło
33
Musi to być funkcja SQL, a nie funkcja .NET.
Jeremy
5
Chociaż SqlDateTime.MinValue jest przydatna, podanie tego jako odpowiedzi jest zwodnicze. @Jeremy prosi o natywną funkcję sql, a nie coś z biblioteki klas .NET
Evan
6
plus jeden za to pomógł w podobnym pytaniu, ale w kontekście .Net, a nie SQL; tak jak w przypadku tego pytania ..
t_plusplus
Może rzeczywiście uda ci się to osiągnąć, używając nowego U-SQL
Kapé
14

Ponieważ nie mogę skomentować zaakceptowanej odpowiedzi ze względu na niewystarczającą liczbę punktów reputacji, mój komentarz jest odpowiedzią.

użycie tej select cast('1753-1-1' as datetime)kończy się niepowodzeniem, jeśli zostanie uruchomione na bazie danych z ustawieniami regionalnymi, które nie akceptują zestawu danych w formacie RRRR-MM-DD.

Zamiast tego użyj select cast(-53690 as datetime)lub a Convertz określonym formatem daty i godziny.

Rune Andersen
źródło
6

Wpisz datę jako wartość natywną, 'yyyymmdd'aby uniknąć problemów regionalnych:

select cast('17530101' as datetime)

Tak, byłoby wspaniale, gdyby TSQL miał MinDate() = '00010101', ale nie ma takiego szczęścia.

Frank Gillich
źródło
4

Oto szybki i bardzo czytelny sposób uzyskania minimalnej wartości daty

Uwaga: jest to funkcja deterministyczna , więc w celu dalszej poprawy wydajności możemy równie dobrze zastosować funkcję WITH SCHEMABINDING do wartości zwracanej.

Utwórz funkcję

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

END

Wywołaj funkcję

dbo.MinDate()

Przykład 1

PRINT dbo.MinDate()

Przykład 2

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

Przykład 3

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

Przykład 4

SELECT dbo.MinDate() AS MinDate

Przykład 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate
WonderWorker
źródło
3

To nie 1 stycznia 1753, ale wybierz rzutowanie ('' jako data / godzina), co ujawnia: 1900-01-01 00: 00: 00.000 podaje domyślną wartość przez serwer SQL. (I tak wygląda na bardziej niezainicjowany)

Tomas Hesse
źródło
2
To nie jest poprawne. Bazowa data i godzina to 1 stycznia 1900 00: 00: 00.000 (co otrzymujesz SELECT CONVERT(DATETIME, 0)), ale rzeczywista minimalna wartość, jaką może przechowywać data-godzina w programie SQL Server, to w rzeczywistości 1753, co napisał OP. Wtedy Ameryka również przeszła na kalendarz gregoriański, a SQL Server nie musi zajmować się brakującymi dniami itp. SELECT CONVERT(DATETIME, -53690)Daje 1753-01-01 00:00:00.000i SELECT CONVERT(DATETIME, -53691)wyświetla błąd o przepełnieniu.
bugybunny
0

To jest to, czego używam, aby uzyskać minimalną datę w SQL Server. Pamiętaj, że jest przyjazny dla globalizacji:

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

Zadzwoń za pomocą:

SELECT [dbo].[DateTimeMinValue]()
CarneyCode
źródło
-1

Zakres dla datetimenie ulegnie zmianie, ponieważ spowodowałoby to przerwanie kompatybilności wstecznej. Więc możesz to na stałe zakodować.

Andomar
źródło
2
To prawda, ale nadal byłoby miło wywołać GetMinDate () lub coś podobnego zamiast CONVERT (datetime, '1753-1-1'), gdziekolwiek potrzebowałem tego użyć.
Jeremy,
@Jeremy: Wiem, co convertrobi, ale GetMinDate()musiałbym zagłębić się w definicję funkcji. Więc gdybym musiał dbać o twój kod, wolałbym ten convertwariant.
Andomar
1
Możesz wiedzieć, co to convertrobi, ale niekoniecznie znasz znaczenie 1753-1-1.
jwg