Tsql VarChar 隐式转换为 SmallDateTime
当对返回的结果使用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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
“01/01/00”基于“ 进行转换两位数年份截止”选项。
所以它变成 01 Jan 2000。
如果您发送“1900-01-01”,那么您的代码显示只有当您的 DOB = 01 Jan 1900 时您才会获得结果。
除此之外,它的工作方式如广告所示。
除非您想运行
执行 sp_proc @DateOfBirth = DEFAULT
来强制忽略 DOB"01/01/00" is converted based on the "two digit year cutoff" option.
So it becomes 01 Jan 2000.
If you send '1900-01-01', then your code shows you'll only get results if you have DOB = 01 Jan 1900.
Other than that, it's working as advertised.
Unless you want to run
Execute sp_proc @DateOfBirth = DEFAULT
to force DOB to be ignored从技术上讲,您应该将以下输出进行比较:
与:
或
Technically, you should be comparing the output of:
to:
or
使用安全格式,如 YYYYMMDD(无破折号)
运行这些命令看看会发生什么
use a safe format like YYYYMMDD (no dashes)
run these also to see what happens