Tsql VarChar implicitement à SmallDateTime
-
21-08-2019 - |
Question
Lors de l'exécution de ce qui suit en utilisant une contrainte smalldatetime sur les résultats renvoyés, j'obtiens zéro résultat :
Execute sp_proc @DateOfBirth = '01/01/1900'
ou
Execute sp_proc @DateOfBirth = '1900-01-01'
Mais lorsque j'utilise l'argument varchar suivant, j'obtiens tout d'un coup des résultats qui correspondent au 1er janvier 2000.La conversion implicite smalldatetime ne fonctionne-t-elle pas pour les dates mm/jj/AAAA et uniquement pour les dates mm/jj/AA ?
Execute sp_proc @DateOfBirth = '01/01/00'
Cela renvoie tous les résultats pour les anniversaires du 01/01/2000 !
CREATE PROCEDURE [dbo].[sp_proc]
-- Add the parameters for the stored procedure here
@DateOfBirth SmallDateTime = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT *
FROM
view_People
WHERE
FirstName LIKE '%' + IsNull(@FName ,FirstName) + '%'
AND
LastName LIKE '%' + IsNull(@LName,LastName) + '%'
AND
DOB = IsNull(@DateOfBirth,DOB)
AND
SSN = IsNull(@SSN,SSN)
La solution
"01/01/00" est converti en fonction du "année limite à deux chiffres" option.Cela devient donc le 1er janvier 2000.
Si vous envoyez « 1900-01-01 », votre code indique que vous n'obtiendrez des résultats que si vous avez DOB = 01 janvier 1900.
A part ça, ça fonctionne comme annoncé.Sauf si tu veux courir Execute sp_proc @DateOfBirth = DEFAULT
pour forcer DOB à être ignoré
Autres conseils
Techniquement, vous devez comparera la sortie:
Execute sp_proc @DateOfBirth = '01/01/00'
à:
Execute sp_proc @DateOfBirth = '01/01/2000'
ou
Execute sp_proc @DateOfBirth = '2000-01-01'
utiliser un format sûr comme AAAAMMJJ (sans tirets)
exécuter ces également pour voir ce qui se passe
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)