Fonction SQL Server pour renvoyer la date minimale (1er janvier 1753)

91

Je recherche une fonction SQL Server pour renvoyer la valeur minimale pour datetime, à savoir le 1er janvier 1753. Je préfère ne pas coder en dur cette valeur de date dans mon script.

Est-ce que quelque chose comme ça existe? (À titre de comparaison, en C #, je pourrais simplement le faire DateTime.MinValue) Ou devrais-je écrire cela moi-même?

J'utilise Microsoft SQL Server 2008 Express.

Jérémie
la source
2
Juste curieux: pourquoi envisagez-vous d'utiliser cette date au lieu de laisser la colonne être NULL à la place?
Joe Stefanelli du
1
Vous pouvez utiliser CONVERT(smalldatetime, 0)pour smalldatetime.
Gabe
5
CONVERT (smalldatetime, 0) ou CONVERT (datetime, 0) ou cast (0 as datetime) n'est pas la valeur minimale de datetime
Gennady Vanin Геннадий Ванин
2
@Joe: La colonne n'autorise pas les valeurs NULL, et je ne veux pas la changer car je ne crée pas cette table.
Jeremy

Réponses:

90

Vous pouvez écrire une fonction définie par l'utilisateur qui renvoie la valeur de date min comme ceci:

select cast(-53690 as datetime)

Ensuite, utilisez cette fonction dans vos scripts, et si jamais vous avez besoin de la changer, il n'y a qu'un seul endroit pour le faire.

Vous pouvez également utiliser cette requête si vous la préférez pour une meilleure lisibilité:

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

Exemple de fonction

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

Usage

select dbo.DateTimeMinValue() as DateTimeMinValue

DateTimeMinValue
-----------------------
1753-01-01 00:00:00.000
RedFilter
la source
55
Si vous allez avoir une constante arbitraire, '1753-1-1'c'est bien mieux que-53690
Gabe
6
Le nom de la fonction rendrait évidente la signification de la valeur.
RedFilter
3
Il n'y a pas de fonction même dans SQL Server 2012 pour obtenir une date min similaire à getdate (), par conséquent, celle ci-dessus est la seule solution possible. Ceci est pour tous ceux qui recherchent une meilleure solution dans la solution liée au serveur SQL 2012.
Ram
1
Utilisez simplement DateTime2 (7). Il correspond exactement au type .NET DateTime. Utiliser sql 'datetime' est un mauvais car utiliser 'varchar' au lieu de 'nvarchar'. «nvarchar» s'aligne sur le type de chaîne .NET. Même idée. Ensuite, vous pouvez simplement utiliser DateTime.MinValue partout.
Triynko
2
Comme mentionné par Frank Gillich ci-dessous, cast('17530101' as datetime)permettra également d'éviter les problèmes régionaux et est légèrement plus lisible que -53690.
Jim
29

Avez-vous vu l' objet SqlDateTime ? utilisez SqlDateTime.MinValuepour obtenir votre date minimum (1 janvier 1753).

Naeem Sarfraz
la source
32
Cela doit être une fonction SQL, pas une fonction .NET.
Jeremy
5
Bien que SqlDateTime.MinValue soit utile, il est trompeur d'avoir cela comme réponse. @Jeremy demande une fonction SQL native, pas quelque chose de la bibliothèque de classes de .NET
Evan
6
plus un pour cela a aidé avec une question similaire mais dans un contexte .Net pas SQL; comme c'est le cas avec cette question ..
t_plusplus
Peut-être que vous pouvez réellement y parvenir en utilisant le nouveau U-SQL
Kapé
13

Comme je ne peux pas commenter la réponse acceptée en raison de points de réputation insuffisant, mon commentaire est une réponse.

l'utilisation de select cast('1753-1-1' as datetime)est due échouer si elle est exécutée sur une base de données avec des paramètres régionaux n'acceptant pas une chaîne de données au format AAAA-MM-JJ.

Utilisez à la place le select cast(-53690 as datetime)ou a Convertavec le format datetime spécifié.

Rune Andersen
la source
6

Saisissez la date en tant que valeur native 'yyyymmdd'pour éviter les problèmes régionaux:

select cast('17530101' as datetime)

Oui, ce serait génial si TSQL avait MinDate() = '00010101', mais pas de chance.

Frank Gillich
la source
4

Voici un moyen rapide et hautement lisible d'obtenir la valeur de date minimale

Remarque: il s'agit d'une fonction déterministe , donc pour améliorer encore les performances, nous pouvons également appliquer WITH SCHEMABINDING à la valeur de retour.

Créer une fonction

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

END

Appeler la fonction

dbo.MinDate()

Exemple 1

PRINT dbo.MinDate()

Exemple 2

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

Exemple 3

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

Exemple 4

SELECT dbo.MinDate() AS MinDate

Exemple 5

DECLARE @MinDate AS DATETIME = dbo.MinDate()

SELECT @MinDate AS MinDate
WonderWorker
la source
3

Ce n'est pas le 1er janvier 1753 mais sélectionnez cast ('' as datetime) qui révèle: 1900-01-01 00: 00: 00.000 donne la valeur par défaut par serveur SQL. (Cela me semble plus non initialisé de toute façon)

Tomas Hesse
la source
1
Ce n'est pas correct. La date / heure de base est le 1er janvier 1900 00: 00: 00.000 (ce que vous obtenez avec SELECT CONVERT(DATETIME, 0)) mais la valeur minimale réelle que la date / heure peut contenir dans SQL Server est en fait en 1753 ce qu'OP a écrit. C'est à ce moment-là que l'Amérique est également passée au calendrier grégorien et que SQL Server n'a pas à gérer les jours manquants, etc. SELECT CONVERT(DATETIME, -53690)donne 1753-01-01 00:00:00.000et SELECT CONVERT(DATETIME, -53691)donne une erreur concernant un débordement.
bugybunny
0

C'est ce que j'utilise pour obtenir la date minimale dans SQL Server. Veuillez noter qu'il est compatible avec la mondialisation:

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

Appel en utilisant:

SELECT [dbo].[DateTimeMinValue]()
CarneyCode
la source
-1

La plage de datetimene changera pas, car cela romprait la compatibilité descendante. Vous pouvez donc le coder en dur.

Andomar
la source
2
C'est vrai, mais ce serait toujours bien d'appeler GetMinDate () ou quelque chose comme ça au lieu de CONVERT (datetime, '1753-1-1') partout où je devais l'utiliser.
Jeremy
@Jeremy: Je sais ce que convertfait, mais GetMinDate()je devrais plonger dans la définition de la fonction. Donc, si je devais maintenir votre code, je préférerais la convertvariante.
Andomar
1
Vous savez peut-être ce que convertfait, mais vous ne connaissez pas nécessairement la signification de 1753-1-1.
jwg