J'ai une procédure stockée T-SQL dans laquelle je souhaite rechercher une valeur particulière et limiter éventuellement limiter la recherche à des dates particulières si elles sont transmises. Si les valeurs nuls sont transmises pour l'une de ces dates, alors je veux ignorer ceux-ci. La façon dont je pense faire cela en définissant les dates d'entrée au minimum ou au maximum s'ils sont nuls. Je préférerais ne pas coder les valeurs minimales et maximales. Donc, je me demande quel équivalent SQL du C # Je pense utiliser des coalesce comme si p> < PRE> XXX PRE> est-il une fonction intégrée / constante / variable / enum, je peux utiliser pour les Toute suggestion? p> p> DateTime.maxvalue code> et DateTime.minvalue code> sont.
3 Réponses :
Il n'y a aucune fonction intégrée pour obtenir les valeurs de temps minimum ou maximum de la date. Vous devez duper le code dur des valeurs ou récupérer les valeurs de la base de données.
Si les paramètres sont NULL code> Vous pouvez simplement sélectionner les dates MIN & Max à partir de la table code> . P> IF (@StartDate IS Null)
BEGIN
SELECT @StartDate = MIN(Birthday) FROM Employee
END
IF (@EndDate IS Null)
BEGIN
SELECT @EndDate = MAX(Birthday) FROM Employee
END
SELECT EmployeeName FROM Employee
WHERE EmployeeID = @EmployeeId AND
Birthday BETWEEN @StartDate AND @EndDate
Je ne pense pas que c'est ce que la Chaitanya voulait dire.
+1 Ce n'est peut-être pas exactement ce que la Chaittanya demandait, mais elle répond suffisamment aux exigences. Aucun codage de la mine et max DateTime nécessaire et la même requête peut être utilisé pour les cas nuls.
Il n'y a pas de cette fonctionnalité de ce type dans SQL Server. Vous pouvez facilement trouver le Dates MIN et Max autorisée dans Bol (1753- 01-01 - 9999-12-31). Ou vous pouvez facilement le code d'une autre date (si vous travaillez avec des anniversaires, 1800-01-01 - 2100-12-31 suffirait probablement). Ou vous pouvez (s'il s'agit de la requête de la plage que vous avez montrée), demandez à la regroupement de revenir à l'anniversaire lui-même:
SELECT EmployeeName
FROM Employee, Constants
WHERE EmployeeID = @EmployeeId AND
Birthday BETWEEN Coalesce(@StartDate, Constants.datetimeMin) AND
Coalesce(@EndDate, Constants.datetimeMax)
Très intéressant. Je n'avais jamais vu le type de motif de coalesce (@startdate, anniversaire) avant. Je pense que la création d'une variable appelée maxDate et Mindate et définir ses valeurs sur les dates codées durs pourrait être beaucoup plus lisible. Mais oui, les informations principales que je cherchais était l'absence des énumes / constantes dans SQL
SQL Server ne semble pas être capable d'utiliser l'index sur la colonne d'anniversaire. Codage dur Min et Max Dates fonctionne bien avec l'index.
pour SQL Server Spécifiquement, selon Bol, les limites sont:
DateTime code>: 1753-01-01 00:00:00 à 9999-12-31 23: 59: 59.997 Li>
-
SmallDateTime code>: 1900-01-01 00:00:00 au 2079-06-06 23: 59: 29.998 Li>
-
date code>: 0001-01-01 à 9999-12-31 li>
-
datetime2 code>: 0001-01-01 00:00:00 à 9999-12-31 23: 59: 59.99999999 Li>
ul> Comme vous pouvez le constater, cela dépend de votre type de données exact. P>
Quant à la requête, je le ferais comme ceci: P>
SELECT EmployeeName
FROM Employee
WHERE EmployeeID = @EmployeeId
AND (@StartDate IS NULL
OR Birthday >= @StartDate)
AND (@EndDate IS NULL
OR Birthday <= @EndDate)
+1 pour les références. Quant à la requête - il doit être testé, entre ... coalesce code> pourrait être plus compréhensible pour le planificateur de requête.