首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tsql隐式到SmallDateTime

Tsql隐式到SmallDateTime
EN

Stack Overflow用户
提问于 2009-02-03 16:51:07
回答 3查看 1.9K关注 0票数 0

在对返回的结果使用小日期时间约束执行以下操作时,将得到零结果:

代码语言:javascript
复制
Execute sp_proc @DateOfBirth =   '01/01/1900' 

代码语言:javascript
复制
Execute sp_proc @DateOfBirth =   '1900-01-01' 

,但是当使用下面的varchar参数时,我突然得到了与2000年1月1日相对应的结果。小时间隐式转换是否不适用于mm/dd/YYYY日期而只适用于mm/dd/YY日期?

代码语言:javascript
复制
Execute sp_proc @DateOfBirth =   '01/01/00' 

这将返回01/01/2000生日的所有结果!

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-03 17:06:30

"01/01/00“是根据”两位数年截止(http://msdn.microsoft.com/en-us/library/ms189577(SQL.90%29.aspx))“选项转换的。所以是2000年1月1日。

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

除此之外,它就像广告中所说的那样起作用了。除非您想运行Execute sp_proc @DateOfBirth = DEFAULT来迫使道布被忽略

票数 2
EN

Stack Overflow用户

发布于 2009-02-03 17:21:13

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

代码语言:javascript
复制
Execute sp_proc @DateOfBirth =   '01/01/00'

至:

代码语言:javascript
复制
Execute sp_proc @DateOfBirth =   '01/01/2000'

代码语言:javascript
复制
Execute sp_proc @DateOfBirth =   '2000-01-01'
票数 1
EN

Stack Overflow用户

发布于 2009-02-03 16:58:15

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

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

代码语言:javascript
复制
select convert(smalldatetime,'19000101')
select convert(smalldatetime,'01/01/00')
select convert(smalldatetime,0)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/507931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档