Tsql VarChar 隐式转换为 SmallDateTime
-
21-08-2019 - |
题
当对返回结果使用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)
不隶属于 StackOverflow