Tsql VarChar неявно в SmallDateTime - PullRequest
       38

Tsql VarChar неявно в SmallDateTime

0 голосов
/ 03 февраля 2009

При выполнении следующего с использованием ограничения smalldatetime для возвращаемых результатов я получаю нулевые результаты:

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

или

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

Но при использовании следующего аргумента varchar неожиданно я получаю результаты, соответствующие 1 января 2000 года. Неявное ли преобразование smalldatetime не работает для дат mm / dd / YYYY и только для дат mm / dd / YY?

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)

Ответы [ 3 ]

2 голосов
/ 03 февраля 2009

«01/01/00» конвертируется на основе опции « двухзначное сокращение года ». Так становится 01 января 2000 года.

Если вы отправите «1900-01-01», то ваш код показывает, что вы получите результаты, только если у вас DOB = 01 января 1900 г.

Кроме этого, он работает как рекламируется. Если вы не хотите запустить Execute sp_proc @DateOfBirth = DEFAULT, чтобы DOB игнорировался

1 голос
/ 03 февраля 2009

Технически, вы должны сравнивать вывод:

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

до:

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

или

Execute sp_proc @DateOfBirth =   '2000-01-01'
0 голосов
/ 03 февраля 2009

используйте безопасный формат, например, ГГГГММДД (без черточек)

запустите их также, чтобы увидеть, что происходит

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