Tsql VarChar隐式地向SmallDateTime发送

时间:2009-02-03 16:51:08

标签: sql-server-2005 tsql varchar smalldatetime

当对返回的结果使用smalldatetime约束执行以下操作时,我得到零结果:

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

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

但是当使用以下varchar参数时,我突然得到对应于2000年1月1日的结果.stixldatetime隐式转换是否不适用于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 个答案:

答案 0 :(得分:2)

“01/01/00”根据“two digit year cutoff”选项进行转换。 所以它成为2000年1月1日。

如果您发送'1900-01-01',那么您的代码显示只有在DOB = 01年1月1日才能获得结果。

除此之外,它正如宣传的那样工作。 除非您想运行Execute sp_proc @DateOfBirth = DEFAULT以强制忽略DOB

答案 1 :(得分:1)

从技术上讲,您应该比较输出:

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

为:

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

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

答案 2 :(得分:0)

使用YYYYMMDD(无破折号)等安全格式

运行这些也看看会发生什么

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