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.
sql-server
datetime
function
Jeremy
źródło
źródło
CONVERT(smalldatetime, 0)
dlasmalldatetime
.Odpowiedzi:
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
źródło
'1753-1-1'
jest znacznie lepsza niż-53690
cast('17530101' as datetime)
pozwoli również uniknąć problemów regionalnych i jest nieco bardziej czytelny niż -53690.Czy widziałeś obiekt SqlDateTime ? użyj,
SqlDateTime.MinValue
aby uzyskać minimalną datę (1 stycznia 1753).źródło
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 aConvert
z określonym formatem daty i godziny.źródło
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.źródło
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ę
Przykład 1
Przykład 2
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
źródło
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)
źródło
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)
Daje1753-01-01 00:00:00.000
iSELECT CONVERT(DATETIME, -53691)
wyświetla błąd o przepełnieniu.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]()
źródło
Zakres dla
datetime
nie ulegnie zmianie, ponieważ spowodowałoby to przerwanie kompatybilności wstecznej. Więc możesz to na stałe zakodować.źródło
convert
robi, aleGetMinDate()
musiałbym zagłębić się w definicję funkcji. Więc gdybym musiał dbać o twój kod, wolałbym tenconvert
wariant.convert
robi, ale niekoniecznie znasz znaczenie1753-1-1
.