Tsql VarChar неявно для SmallDateTime
-
21-08-2019 - |
Вопрос
При выполнении следующего с использованием ограничения smalldatetime для возвращаемых результатов я получаю нулевые результаты:
Execute sp_proc @DateOfBirth = '01/01/1900'
или
Execute sp_proc @DateOfBirth = '1900-01-01'
Но при использовании следующего аргумента varchar я внезапно получаю результаты, соответствующие 1 января 2000 года.Неявное преобразование smalldatetime не работает для дат мм/дд/ГГГГ и только для дат мм/дд/ГГ?
Execute sp_proc @DateOfBirth = '01/01/00'
Это возвращает все результаты для дней рождения 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)
Решение
«01.01.00» преобразуется на основе «двухзначное отсечение года" вариант.Итак, это будет 01 января 2000 года.
Если вы отправите «1900-01-01», ваш код покажет, что вы получите результаты только в том случае, если у вас есть дата рождения = 01 января 1900 года.
В остальном, он работает так, как заявлено.Если только ты не хочешь бежать Execute sp_proc @DateOfBirth = DEFAULT
чтобы заставить DOB игнорироваться
Другие советы
Технически, вы должны сравнивать результаты:
Execute sp_proc @DateOfBirth = '01/01/00'
к:
Execute sp_proc @DateOfBirth = '01/01/2000'
или
Execute sp_proc @DateOfBirth = '2000-01-01'
используйте безопасный формат, например ГГГГММДД (без тире).
запустите их также, чтобы посмотреть, что произойдет
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)