Funzione SQL Server per restituire la data minima (1 gennaio 1753)


91

Sto cercando una funzione di SQL Server per restituire il valore minimo per datetime, vale a dire il 1 ° gennaio 1753. Preferisco non codificare tale valore di data nel mio script.

Esiste qualcosa del genere? (Per confronto, in C #, potrei semplicemente farlo DateTime.MinValue) O dovrei scriverlo da solo?

Sto usando Microsoft SQL Server 2008 Express.


2
Solo curioso: perché hai intenzione di usare quella data invece di lasciare che la colonna sia NULL?
Joe Stefanelli

1
Potresti usare CONVERT(smalldatetime, 0)per smalldatetime.
Gabe

5
CONVERT (smalldatetime, 0) o CONVERT (datetime, 0) o cast (0 come datetime) non è il valore minimo di datetime
Gennady Vanin Геннадий Ванин

2
@ Joe: la colonna non consente valori NULL e non voglio cambiarla poiché non sto creando questa tabella.
Jeremy,

Risposte:


90

È possibile scrivere una funzione definita dall'utente che restituisca il valore della data minima in questo modo:

select cast(-53690 as datetime)

Quindi usa quella funzione nei tuoi script e, se hai bisogno di cambiarla, c'è solo un posto per farlo.

In alternativa, puoi utilizzare questa query se preferisci per una migliore leggibilità:

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

Funzione di esempio

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

Utilizzo

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000

55
Se hai una costante arbitraria, '1753-1-1'è molto meglio di-53690
Gabe

6
Il nome della funzione renderebbe evidente il significato del valore.
RedFilter

3
Non esiste alcuna funzione anche in SQL Server 2012 per ottenere una data minima simile a getdate (), quindi quella sopra è l'unica soluzione possibile. Questo è per chiunque sia alla ricerca di una soluzione migliore nella soluzione relativa a SQL Server 2012.
Ariete

1
Usa semplicemente DateTime2 (7). Si associa esattamente al tipo .NET DateTime. L'uso di sql "datetime" non è corretto in quanto utilizzare "varchar" invece di "nvarchar". "nvarchar" è allineato al tipo di stringa .NET. Stessa idea. Quindi puoi semplicemente usare DateTime.MinValue ovunque.
Triynko

2
Come accennato di seguito da Frank Gillich, cast('17530101' as datetime)eviterà anche i problemi regionali ed è leggermente più leggibile di -53690.
Jim,

29

Hai visto l' oggetto SqlDateTime ? utilizzare SqlDateTime.MinValueper ottenere la data minima (1 gennaio 1753).


32
Deve essere una funzione SQL, non una funzione .NET.
Jeremy,

5
Sebbene SqlDateTime.MinValue sia utile, è ingannevole averlo come risposta. @ Jeremy sta chiedendo una funzione sql nativa, non qualcosa dalla libreria di classi .NET
Evan

6
più uno per questo ha aiutato con una domanda simile ma in un contesto .Net non SQL; come nel caso di questa domanda ..
t_plusplus

Forse puoi effettivamente raggiungere questo obiettivo utilizzando il nuovo U-SQL
Kapé

13

Poiché non posso commentare la risposta accettata a causa di punti di reputazione insoddisfacenti, il mio commento è una risposta.

l'utilizzo di select cast('1753-1-1' as datetime)è dovuto a un errore se eseguito su un database con impostazioni internazionali che non accettano una stringa di dati nel formato AAAA-MM-GG.

Utilizzare invece select cast(-53690 as datetime)o a Convertcon il formato datetime specificato.


6

Inserisci la data come valore nativo 'yyyymmdd'per evitare problemi regionali:

select cast('17530101' as datetime)

Sì, sarebbe fantastico se avesse TSQL MinDate() = '00010101', ma non tale fortuna.


4

Ecco un modo veloce e altamente leggibile per ottenere il valore della data minima

Nota: questa è una funzione deterministica , quindi per migliorare ulteriormente le prestazioni potremmo anche applicare WITH SCHEMABINDING al valore restituito.

Crea una funzione

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

END

Chiama la funzione

dbo.MinDate()

Esempio 1

PRINT dbo.MinDate()

Esempio 2

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

Esempio 3

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

Esempio 4

SELECT dbo.MinDate() AS MinDate

Esempio 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate

3

Non è il 1 gennaio 1753 ma seleziona cast ('' come datetime) che rivela: 1900-01-01 00: 00: 00.000 fornisce il valore predefinito dal server SQL. (Mi sembra comunque più non inizializzato)


1
Questo non è corretto. Il datetime di base è 1 Jan 1900 00: 00: 00.000 (cosa ottieni SELECT CONVERT(DATETIME, 0)) ma il valore minimo effettivo che datetime può contenere in SQL Server è in realtà nel 1753 quello che ha scritto OP. In quel momento anche l'America è passata al calendario gregoriano e SQL Server non ha a che fare con i giorni mancanti ecc. SELECT CONVERT(DATETIME, -53690)1753-01-01 00:00:00.000e SELECT CONVERT(DATETIME, -53691)dà un errore su un overflow.
bugybunny

0

Questo è ciò che utilizzo per ottenere la data minima in SQL Server. Si prega di notare che è favorevole alla globalizzazione:

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

Chiama utilizzando:

SELECT [dbo].[DateTimeMinValue]()

-1

L'intervallo per datetimenon cambierà, poiché ciò interromperebbe la compatibilità con le versioni precedenti. Quindi puoi codificarlo.


2
Questo è vero, ma sarebbe comunque bello chiamare GetMinDate () o qualcosa del genere invece di CONVERT (datetime, '1753-1-1') ovunque fosse necessario usarlo.
Jeremy,

@ Jeremy: so cosa convertfa, ma GetMinDate()dovrei immergermi nella definizione della funzione. Quindi, se dovessi mantenere il tuo codice, preferirei la convertvariante.
Andomar

1
Potresti sapere cosa convertfa, ma non dovresti necessariamente conoscere il significato di 1753-1-1.
jwg
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.