首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server \ IsNull \ DateTime和SmallDateTime

Server \ IsNull \ DateTime和SmallDateTime
EN

Stack Overflow用户
提问于 2016-09-06 22:13:51
回答 3查看 2K关注 0票数 0

我有下表:

代码语言:javascript
复制
create table #temp_1234
(
    field1 varchar(50) null,
    field2 datetime null,
    field3 smalldatetime null
)

例如,我在其中插入以下一行:

代码语言:javascript
复制
insert into #temp_1234
(field1, field2, field3)
values ('Val1','2016-09-16 23:59:59.000',NULL)

如果我执行查询

代码语言:javascript
复制
select field2 from #temp_1234

我得到的结果是“2016-09-16 23:59:59.000”。

但是当我执行查询时

代码语言:javascript
复制
select ISNULL(field3,field2)  from #temp_1234

结果是“2016-09-17:00:00:00”。

即使在这两个查询中返回相同的列,结果在这两种情况下是如何不同的呢?

我知道'smalldatetime‘在一分钟内是精确的,而'datetime’则是精确到1秒钟的。但是引入null检查如何改变返回结果的精度呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-06 22:40:26

ISNULL使用两个参数,check_expressionreplacement_value。如replacement_value文档中所述

如果check_expression为NULL,则返回的表达式。replacement_value必须是隐式可转换为check_expresssion类型的类型。

本质上,SQL查询引擎是隐式地转换值以进行比较。Datetime有一个精确的3.33ms,所以很有可能是四舍五入的。

如果您想获得对转换的更多控制,请考虑使用显式转换 (如CASTCONVERT )。

这也可能是聚结函数的一个很好的用例,而不是ISNULL

票数 3
EN

Stack Overflow用户

发布于 2016-09-06 22:45:57

isnull将第二个值转换为第一个值格式。

更清楚的是:

声明@日期日期,@datetime datetime = getdate()选择isnull( @date,@datetime)

票数 0
EN

Stack Overflow用户

发布于 2016-09-07 05:48:16

代码语言:javascript
复制
select ISNULL(field3,field2)  from #temp_1234

当超出上述查询时,"field2“的值将转换为smalldatetime类型,因为field3的数据类型是smalldatetime。这就是ISNULL返回不同值的原因。要验证您可以运行以下查询:

代码语言:javascript
复制
select cast(field2 as smalldatetime) from #temp_1234

smalldatetime中,秒部分总是为零(00)。如果datetime值的秒大于或等于30秒以上,则向结果的smalldatetime值中添加1分钟,并将秒设置为零。在少于30秒的时间内,产生的smalldatetime值将秒部分设置为00,分钟部分与前面相同。

在你的例子中,datetime值是:'2016-09-16 23:59:59.000‘。由于datetime值的秒部分大于30,所以将1分钟添加到结果的smalldatetime值中,从而得到值:“2016-09-1700:00:00:00”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39358628

复制
相关文章

相似问题

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