当对返回的结果使用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)
答案 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)