Tsql VarChar implicitamente a smalldatetime
-
21-08-2019 - |
Domanda
Quando si esegue il seguente utilizzando un vincolo smalldatetime sui risultati restituiti, ottengo risultati zero:
Execute sp_proc @DateOfBirth = '01/01/1900'
o
Execute sp_proc @DateOfBirth = '1900-01-01'
Ma quando si utilizza il seguente argomento varchar tutto l'improvviso ottengo risultati che corrispondono a 1 Gennaio 2000. Fa smalldatetime conversione implicita non funzionare per le date mm / gg / aaaa e uniche date mm / gg / aa?
Execute sp_proc @DateOfBirth = '01/01/00'
Ciò restituisce tutti i risultati per i compleanni 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)
Soluzione
"01/01/00" è convertito sulla base del " due anni cifre cutoff " opzione. Così diventa 1 gennaio, 2000.
Se si invia '1900-01-01', allora il tuo codice mostra si otterrà risultati solo se si dispone di DOB = 1 gennaio 1900.
Oltre a questo, sta funzionando come pubblicizzato.
A meno che non si desidera eseguire Execute sp_proc @DateOfBirth = DEFAULT
per forzare DOB essere ignorato
Altri suggerimenti
Tecnicamente, si dovrebbe essere confrontando l'output di:
Execute sp_proc @DateOfBirth = '01/01/00'
a:
Execute sp_proc @DateOfBirth = '01/01/2000'
o
Execute sp_proc @DateOfBirth = '2000-01-01'
utilizzare un formato sicura come AAAAMMGG (senza trattini)
eseguire questi anche per vedere cosa succede
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)