2009-02-03 4 views
0

Lors de l'exécution de ce qui suit en utilisant une contrainte smalldatetime sur les résultats retournés, je reçois aucun résultat:Tsql VarChar implicitement SmallDateTime

Execute sp_proc @DateOfBirth = '01/01/1900' 

ou

Execute sp_proc @DateOfBirth = '1900-01-01' 

Mais lorsque vous utilisez le varchar suivant argument tout à coup je reçois des résultats qui correspondent au 1 janvier 2000. La conversion implicite de smalldatetime ne fonctionne pas pour les dates mm/jj/aaaa et seulement pour les dates mm/jj/aa?

Execute sp_proc @DateOfBirth = '01/01/00' 

Cela renvoie tous les résultats pour 01/01/2000 anniversaires!

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) 

Répondre

2

"01/01/00" est converti sur la base "two digit year cutoff" option. Ainsi, il devient le 1 janvier 2000.

Si vous envoyez « 1900-01-01 », puis votre code vous montre que vous obtiendrez des résultats si vous avez DOB = 01 janv 1900.

Autre que cela, ça marche comme annoncé. À moins que vous souhaitez exécuter Execute sp_proc @DateOfBirth = DEFAULT pour forcer la date de naissance pour être ignoré

0

utilisent un format sûr comme AAAAMMJJ (sans tirets)

l'exécution de ces également pour voir ce qui se passe

select convert(smalldatetime,'19000101') 
select convert(smalldatetime,'01/01/00') 
select convert(smalldatetime,0) 
1

Techniquement, vous devriez comparer la sortie de:

Execute sp_proc @DateOfBirth = '01/01/00' 

à:

Execute sp_proc @DateOfBirth = '01/01/2000' 

ou

Execute sp_proc @DateOfBirth = '2000-01-01'