8
votes

SQL Recherche de date entre les valeurs ou min / max si NULL

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 # DateTime.maxvalue et DateTime.minvalue sont.

Je pense utiliser des coalesce comme si < PRE> XXX

est-il une fonction intégrée / constante / variable / enum, je peux utiliser pour les et variables?

Toute suggestion?


0 commentaires

3 Réponses :


3
votes

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


2 commentaires

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.



11
votes

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)


2 commentaires

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.



4
votes

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 commentaires

+1 pour les références. Quant à la requête - il doit être testé, entre ... coalesce pourrait être plus compréhensible pour le planificateur de requête.