Função do SQL Server para retornar a data mínima (1º de janeiro de 1753)

91

Estou procurando uma função do SQL Server para retornar o valor mínimo para data e hora, ou seja, 1º de janeiro de 1753. Prefiro não codificar esse valor de data em meu script.

Existe algo assim? (Para efeito de comparação, em C #, eu poderia apenas fazer DateTime.MinValue) ou teria que escrever isso sozinho?

Estou usando o Microsoft SQL Server 2008 Express.

Jeremy
fonte
2
Apenas curiosidade: por que você está planejando usar essa data ao invés de deixar a coluna ser NULL?
Joe Stefanelli
1
Você poderia usar CONVERT(smalldatetime, 0)para smalldatetime.
Gabe
5
CONVERT (smalldatetime, 0) ou CONVERT (datetime, 0) ou cast (0 como datetime) não é o valor mínimo de datetime
Gennady Vanin Геннадий Ванин
2
@Joe: A coluna não permite valores NULL, e não quero alterá-la, pois não estou criando esta tabela.
Jeremy

Respostas:

90

Você poderia escrever um função definida pelo usuário que retorna o valor mínimo da data como este:

select cast(-53690 as datetime)

Em seguida, use essa função em seus scripts e, se precisar alterá-la, só há um lugar para fazer isso.

Como alternativa, você pode usar esta consulta se preferir para melhor legibilidade:

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

Função de exemplo

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
fonte
55
Se você vai ter uma constante arbitrária, '1753-1-1'é muito melhor do que-53690
Gabe
6
O nome da função tornaria óbvio o significado do valor.
RedFilter
3
Não há função, mesmo no SQL Server 2012, para obter a data mínima semelhante a getdate (), portanto, a acima é a única solução possível. Isso é para quem está procurando a melhor solução em solução relacionada ao sql server 2012.
Ram
1
Basta usar DateTime2 (7). Ele mapeia exatamente para o tipo .NET DateTime. Usar sql 'datetime' é tão ruim quanto usar 'varchar' em vez de 'nvarchar'. 'nvarchar' se alinha com o tipo .NET String. Mesma ideia. Então você pode usar DateTime.MinValue em qualquer lugar.
Triynko
2
Conforme mencionado por Frank Gillich abaixo, cast('17530101' as datetime)também evitará os problemas regionais e é um pouco mais legível do que -53690.
Jim
29

Você viu o objeto SqlDateTime ? use SqlDateTime.MinValuepara obter sua data mínima (1 de janeiro de 1753).

Naeem Sarfraz
fonte
32
Isso precisa ser uma função SQL, não uma função .NET.
Jeremy
5
Embora SqlDateTime.MinValue seja útil, é enganoso ter isso como uma resposta. @Jeremy está pedindo uma função sql nativa, não algo da biblioteca de classes do .NET
Evan,
6
mais um para isso ajudou com uma pergunta semelhante, mas em um contexto .Net não SQL; como é o caso desta pergunta ..
t_plusplus
Talvez você possa realmente conseguir isso usando o novo U-SQL
Kapé
13

Como não posso comentar a resposta aceita devido a pontos de reputação insuficientes, meu comentário vem como uma resposta.

o uso de select cast('1753-1-1' as datetime)deve falhar se executado em um banco de dados com configurações regionais que não aceitam uma sequência de dados no formato AAAA-MM-DD.

Em vez disso, use select cast(-53690 as datetime)ou Convertcom o formato de data e hora especificado.

Rune Andersen
fonte
6

Insira a data como um valor nativo 'yyyymmdd'para evitar problemas regionais:

select cast('17530101' as datetime)

Sim, seria ótimo se o TSQL tivesse MinDate() = '00010101', mas não teve essa sorte.

Frank gillich
fonte
4

Aqui está uma maneira rápida e altamente legível de obter o valor da data mínima

Observação: esta é uma função determinística , portanto, para melhorar ainda mais o desempenho, podemos também aplicar WITH SCHEMABINDING ao valor de retorno.

Crie uma função

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

END

Chame a função

dbo.MinDate()

Exemplo 1

PRINT dbo.MinDate()

Exemplo 2

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

Exemplo 3

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

Exemplo 4

SELECT dbo.MinDate() AS MinDate

Exemplo 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate
WonderWorker
fonte
3

Não é 1º de janeiro de 1753, mas selecione cast ('' como data e hora) que revela: 1900-01-01 00: 00: 00.000 dá o valor padrão pelo servidor SQL. (Parece mais não inicializado para mim de qualquer maneira)

Tomas Hesse
fonte
1
Isso não está correto. A data e hora base é 1 de janeiro de 1900 00: 00: 00.000 (o que você obtém SELECT CONVERT(DATETIME, 0)), mas o valor mínimo real que a data e hora pode conter no SQL Server é na verdade em 1753 o que OP escreveu. Foi quando a América também mudou para o calendário gregoriano e o SQL Server não tem que lidar com dias perdidos etc. SELECT CONVERT(DATETIME, -53690)1753-01-01 00:00:00.000e SELECT CONVERT(DATETIME, -53691)dá um erro sobre um estouro.
bugybunny
0

É isso que eu uso para obter a data mínima no SQL Server. Observe que é favorável à globalização:

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

Ligue usando:

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

O intervalo de datetimenão será alterado, pois isso interromperia a compatibilidade com versões anteriores. Então você pode codificá-lo.

Andomar
fonte
2
Isso é verdade, mas ainda seria bom chamar GetMinDate () ou algo parecido em vez de CONVERT (datetime, '1753-1-1') onde quer que eu precisasse usá-lo.
Jeremy
@Jeremy: Eu sei o que convertfaz, mas GetMinDate()teria que mergulhar na definição da função. Portanto, se eu tivesse que manter seu código, preferiria a convertvariante.
Andomar
1
Você pode saber o que convertsignifica, mas não necessariamente sabe o significado de 1753-1-1.
jwg