0

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

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

或者

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

但是,当突然使用以下 varchar 参数时,我得到了对应于 2000 年 1 月 1 日的结果。 smalldatetime 隐式转换是否不适用于 mm/dd/YYYY 日期并且仅适用于 mm/dd/YY 日期?

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

这将返回 2000 年 1 月 1 日生日的所有结果!

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)
4

3 回答 3

2

“01/01/00”基于“两位数年份截止”选项进行转换。所以它变成了 2000 年 1 月 1 日。

如果您发送“1900-01-01”,那么您的代码显示只有当 DOB = 1900 年 1 月 1 日时您才会得到结果。

除此之外,它的工作方式与宣传的一样。除非你想跑Execute sp_proc @DateOfBirth = DEFAULT强制 DOB 被忽略

于 2009-02-03T17:06:30.023 回答
1

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

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

到:

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

或者

Execute sp_proc @DateOfBirth =   '2000-01-01'
于 2009-02-03T17:21:13.910 回答
0

使用像 YYYYMMDD 这样的安全格式(没有破折号)

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

select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)
于 2009-02-03T16:58:15.140 回答