Tsql VarChar implicitamente Smalldatetime
-
21-08-2019 - |
Pergunta
Ao executar o seguinte usando uma restrição smalldatetime sobre os resultados retornados, recebo zero resultados:
Execute sp_proc @DateOfBirth = '01/01/1900'
ou
Execute sp_proc @DateOfBirth = '1900-01-01'
Mas quando usando o seguinte argumento varchar de repente eu obter resultados que correspondem a 01 janeiro de 2000. Será que smalldatetime conversão implícita não trabalho para datas mm / DD / AAAA e apenas mm datas / dd / aa?
Execute sp_proc @DateOfBirth = '01/01/00'
Isso retorna todos os resultados para 01/01/2000 aniversários!
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)
Solução
"01/01/00" é convertido com base no " ano de fechamento de dois dígitos ". Assim torna-se 01 de janeiro de 2000.
Se você enviar '1900-01-01', então o seu mostra o código que você só vai obter resultados se você tiver DOB = 01 de janeiro de 1900.
Além disso, ele está trabalhando como anunciado.
A menos que você deseja executar Execute sp_proc @DateOfBirth = DEFAULT
à força DOB para ser ignorado
Outras dicas
Tecnicamente, você deve estar comparando a saída:
Execute sp_proc @DateOfBirth = '01/01/00'
para:
Execute sp_proc @DateOfBirth = '01/01/2000'
ou
Execute sp_proc @DateOfBirth = '2000-01-01'
usar um formato seguro como AAAAMMDD (sem traços)
executar estes também para ver o que acontece
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)