SQL de recherche de date entre les valeurs ou Min/Max si la valeur est NULL
J'ai une procédure stockée T-SQL où je recherche une valeur particulière et éventuellement limiter la recherche à des dates particulières si elles sont transmises. Si les valeurs null sont passés dans l'une ni l'autre de ces dates, alors je veux ignorer ceux. La façon dont je suis la pensée de faire cela par réglage de l'entrée des dates de minimum ou maximum si ils sont nuls. Je préfère ne pas coder en dur les valeurs minimale et maximale. Donc, je me demande ce que le SQL équivalent du C# DateTime.MaxValue
et DateTime.MinValue
sont.
Je pense à l'aide de Fusionner comme
SELECT EmployeeName FROM Employee
WHERE EmployeeID = @EmployeeId AND
Birthday BETWEEN Coalesce(@StartDate, <MinDateTime>) AND
Coalesce(@EndDate, <MaxDateTime>)
Est-il une fonction intégrée/constante/variable/enum je peux utiliser pour le <MinDateTime>
et <MaxDateTime>
variables?
Des suggestions?
OriginalL'auteur Chaitanya | 2010-09-20
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de telles fonctionnalités de SQL Server. Vous pouvez facilement trouver les min et max de dates permis à BOL (1753-01-01 - 9999-12-31). Ou vous pouvez coder en dur une autre date facilement (si vous êtes vraiment à travailler avec les anniversaires, 1800-01-01 - 2100-12-31 serait probablement suffisant). Ou vous pouvez (si c'est la portée de la requête que vous avez montré), ont les fusionner en revenir à l'anniversaire lui-même:
Mais notez que cela ne sera pas nécessairement à l'échelle pour les très grandes tables.
Édité après l'accepter, pour répondre à un commentaire de l'OP
Généralement, pour SQL, si tu as besoin de "référence" des données fréquemment, vous l'ajouter à un tableau vous-même. (Google de "calendrier de table" ou "numéro de table sql"). Ainsi, dans cet exemple, si vous voulez, vous pouvez ajouter un "constantes" (ou peut-être les "limites" de la table):
Qui vous pourriez alors faire référence dans les requêtes (soit par le biais d'une sous-sélection, ou par la croix-de se joindre à cette table). E. g.
(La Serrure, Clé Primaire, et la Vérification de la contrainte, de travailler ensemble pour s'assurer que d'une seule ligne ne sera jamais exister dans ce tableau)
Re FUSIONNENT truc - +1 pour la déclaration qu'il ne serait pas à l'échelle pour les grandes tables, SQL Server ne semble pas être en mesure d'utiliser l'index sur l'Anniversaire de la colonne. Le codage en dur des min et max de dates fonctionne bien avec l'index.
OriginalL'auteur Damien_The_Unbeliever
Pour SQL Server précisément, selon BOL, les limites sont:
datetime
: 1753-01-01 00:00:00 par 9999-12-31 23:59:59.997smalldatetime
: 1900-01-01 00:00:00 par 2079-06-06 23:59:29.998date
: 0001-01-01 par 9999-12-31datetime2
: 0001-01-01 00:00:00 par 9999-12-31 23:59:59.9999999Comme vous pouvez le voir, cela dépend de votre type de données exactes.
Que, pour la requête, je voudrais faire comme ceci:
BETWEEN ... COALESCE
peut-être plus compréhensible pour le planificateur de requête.OriginalL'auteur Michel de Ruiter
Il n'y a pas des fonctions intégrées pour obtenir le minimum ou le maximum des valeurs de date et heure. Vous devez coder en dur les valeurs ou récupérer les valeurs de la base de données.
Si les paramètres sont
NULL
vous pouvez simplement sélectionner le min & max dates de laEmployee
table.+1, Il peut ne pas être exactement ce que Chaitanya demandait, mais il répond aux exigences assez bien. Pas de coder en dur les de min et max datetime nécessaire et même requête peut être utilisée pour les nuls cas
OriginalL'auteur codingbadger