当对返回结果使用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' 

这将返回 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”是根据“两位数年份截止“ 选项。所以它变成了 2000 年 1 月 1 日。

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

除此之外,它的工作原理如广告所示。除非你想跑 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'

使用像YYYYMMDD安全格式(无划线)

运行这些还看个究竟

select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top