Tsql VarChar implícitamente a SMALLDATETIME
-
21-08-2019 - |
Pregunta
Al ejecutar el siguiente utilizando una restricción smalldatetime en los resultados devueltos, consigo cero resultados:
Execute sp_proc @DateOfBirth = '01/01/1900'
o
Execute sp_proc @DateOfBirth = '1900-01-01'
Sin embargo, cuando se utiliza el siguiente argumento varchar todos los repentina i obtener resultados que corresponden al 1 Ene 2000. ¿El smalldatetime conversión implícita no funcionar para las fechas mm / día / año y únicas fechas mm / dd / aa?
Execute sp_proc @DateOfBirth = '01/01/00'
Esto devuelve todos los resultados de 01/01/2000 cumpleaños!
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)
Solución
"01/01/00" se convierte en base a la " dos dígito del año de corte " opción. Por lo que se convierte en 01 Ene de 2000.
Si envía '1900-01-01', entonces su código de muestra que sólo va a obtener resultados si tiene DOB = 01 Ene 1900.
Aparte de eso, está funcionando como se anuncia.
A menos que desee ejecutar Execute sp_proc @DateOfBirth = DEFAULT
para forzar DOB para ser ignorado
Otros consejos
Técnicamente, se debe comparar la salida de:
Execute sp_proc @DateOfBirth = '01/01/00'
a:
Execute sp_proc @DateOfBirth = '01/01/2000'
o
Execute sp_proc @DateOfBirth = '2000-01-01'
utilizar un formato seguro como AAAAMMDD (sin guiones)
ejecutar estos también ver lo que sucede
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)