Función de SQL Server para devolver la fecha mínima (1 de enero de 1753)

91

Estoy buscando una función de SQL Server para devolver el valor mínimo para la fecha y hora, a saber, el 1 de enero de 1753. Prefiero no codificar ese valor de fecha en mi secuencia de comandos.

¿Existe algo así? (A modo de comparación, en C #, podría simplemente hacer ¿ DateTime.MinValue) O tendría que escribir esto yo mismo?

Estoy usando Microsoft SQL Server 2008 Express.

Jeremy
fuente
2
Solo curiosidad: ¿Por qué planeas usar esa fecha en lugar de dejar que la columna sea NULL?
Joe Stefanelli
1
Podrías usar CONVERT(smalldatetime, 0)para smalldatetime.
Gabe
5
CONVERT (smalldatetime, 0) o CONVERT (datetime, 0) o cast (0 como fecha y hora) no es el valor mínimo de datetime
Gennady Vanin Геннадий Ванин
2
@Joe: La columna no permite valores NULL y no quiero cambiarla ya que no estoy creando esta tabla.
Jeremy

Respuestas:

90

Podría escribir una función definida por el usuario que devuelva el valor de fecha mínima como este:

select cast(-53690 as datetime)

Luego use esa función en sus scripts, y si alguna vez necesita cambiarla, solo hay un lugar para hacerlo.

Alternativamente, puede usar esta consulta si lo prefiere para una mejor legibilidad:

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

Función de ejemplo

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

Uso

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000
RedFilter
fuente
55
Si va a tener una constante arbitraria, '1753-1-1'es mucho mejor que-53690
Gabe
6
El nombre de la función haría obvio el significado del valor.
RedFilter
3
No hay ninguna función incluso en SQL Server 2012 para obtener una fecha mínima similar a getdate (), por lo que la anterior es la única solución posible. Esto es para cualquiera que busque una mejor solución en la solución relacionada con SQL Server 2012.
Ram
1
Simplemente use DateTime2 (7). Se asigna exactamente al tipo .NET DateTime. Usar sql 'datetime' es tan malo como usar 'varchar' en lugar de 'nvarchar'. 'nvarchar' se alinea con el tipo de cadena .NET. La misma idea. Entonces puede usar DateTime.MinValue en todas partes.
Triynko
2
Como lo menciona Frank Gillich a continuación, cast('17530101' as datetime)también evitará los problemas regionales y es un poco más legible que -53690.
Jim
29

¿Ha visto el objeto SqlDateTime ? use SqlDateTime.MinValuepara obtener su fecha mínima (1 de enero de 1753).

Naeem Sarfraz
fuente
32
Debe ser una función SQL, no una función .NET.
Jeremy
5
Aunque SqlDateTime.MinValue es útil, es engañoso tener esto como respuesta. @Jeremy solicita una función sql nativa, no algo de la biblioteca de clases de .NET
Evan
6
más uno para esto ayudó con una pregunta similar pero en un contexto .Net no SQL; como es el caso de esta pregunta ..
t_plusplus
Tal vez pueda lograrlo utilizando el nuevo U-SQL
Kapé
13

Como no puedo comentar sobre la respuesta aceptada debido a puntos de reputación insuficientes, mi comentario llega como respuesta.

utilizando la select cast('1753-1-1' as datetime) se debe fallar si se ejecuta en una base de datos con configuraciones regionales que no aceptan una cadena de fecha con el formato AAAA-MM-DD.

En su lugar, utilice select cast(-53690 as datetime)o a Convertcon el formato de fecha y hora especificado.

Rune Andersen
fuente
6

Ingrese la fecha como un valor nativo 'yyyymmdd'para evitar problemas regionales:

select cast('17530101' as datetime)

Sí, sería genial si TSQL lo hubiera hecho MinDate() = '00010101', pero no tuve tanta suerte.

Frank Gillich
fuente
4

Aquí hay una forma rápida y altamente legible de obtener el valor de fecha mínima

Nota: Esta es una función determinista , por lo que para mejorar aún más el rendimiento, podríamos aplicar WITH SCHEMABINDING al valor de retorno.

Crea una función

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

END

Llamar a la función

dbo.MinDate()

Ejemplo 1

PRINT dbo.MinDate()

Ejemplo 2

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

Ejemplo 3

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

Ejemplo 4

SELECT dbo.MinDate() AS MinDate

Ejemplo 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate
WonderWorker
fuente
3

No es el 1 de enero de 1753, pero seleccione cast ('' como fecha y hora) que revela: 1900-01-01 00: 00: 00.000 da el valor predeterminado por el servidor SQL. (De todos modos, me parece más no inicializado)

Tomas Hesse
fuente
1
Esto no es correcto. La fecha y hora base es el 1 de enero de 1900 00: 00: 00.000 (lo que obtiene SELECT CONVERT(DATETIME, 0)) pero el valor mínimo real que la fecha y hora puede contener en SQL Server es en realidad en 1753 lo que escribió OP. Fue entonces cuando Estados Unidos también cambió al calendario gregoriano y SQL Server no tiene que lidiar con los días perdidos, etc. SELECT CONVERT(DATETIME, -53690)da 1753-01-01 00:00:00.000y SELECT CONVERT(DATETIME, -53691)da un error sobre un desbordamiento.
bugybunny
0

Esto es lo que uso para obtener la fecha mínima en SQL Server. Tenga en cuenta que es compatible con la globalización:

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

Llamar usando:

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

El rango de datetimeno cambiará, ya que eso rompería la compatibilidad con versiones anteriores. Para que pueda codificarlo de forma rígida.

Andomar
fuente
2
Eso es cierto, pero aún sería bueno llamar a GetMinDate () o algo así en lugar de CONVERT (datetime, '1753-1-1') donde sea que necesite usarlo.
Jeremy
@Jeremy: Sé lo que converthace, pero GetMinDate()tendría que sumergirme en la definición de la función. Entonces, si tuviera que mantener su código, preferiría la convertvariante.
Andomar
1
Es posible que sepa lo que converthace, pero no necesariamente conocerá el significado de 1753-1-1.
jwg