为什么ss会绕到最近的分钟,这会改变一天

时间:2014-03-19 08:53:33

标签: sql sql-server datetime sql-server-2008-r2 rounding

我正在使用sql server 2008 R2,由于一个问题,我能够知道smalldatetime将ss舍入到最接近的分钟。这是来自MSDN的内容。

ss is two digits, ranging from 00 to 59, that represent the second. Values that are 29.998 seconds or less are rounded down to the nearest minute, Values of 29.999 seconds or more are rounded up to the nearest minute.

现在我面临一个问题,即我在我的storedproceduer中有参数类型是当我通过'2014-03-23 23:59:59'转换为日期2014-03-24 00:00:00时的小时候

我找到了我应该将参数从smalldatetime转换为nvarchar(30)

的解决方案

问题解决了。

但我真正质疑为什么smalldatetime围绕 ss 的行为会改变这一天的行为?

您可以使用以下查询进行尝试

DECLARE @EndDate smallDatetime
SET @EndDate = '2014-03-23 23:59:59'
SELECT @EndDate

DECLARE @EndDate smallDatetime
SET @EndDate = '2014-03-23 23:59:30'
SELECT @EndDate

DECLARE @EndDate smallDatetime
SET @EndDate = '2014-03-23 23:59:29'
SELECT @EndDate

2 个答案:

答案 0 :(得分:5)

每当我看到有人在SQL中使用23:59:59时,警报就会响起。

这几乎总是因为他们希望通过执行以下操作返回查询中的全天数据:

WHERE  date_field BETWEEN '2014-03-19 00:00:00' AND '2014-03-19 23:59:59'

这是因为BETWEEN包含了边界值,您可能不希望包含2014-03-20 00:00:00的值。

以上查询相当于:

WHERE  date_field >= '2014-03-19 00:00:00'
AND    date_field <= '2014-03-19 23:59:59'

正确方法

WHERE  date_field >= '2014-03-19 00:00:00'
AND    date_field <  '2014-03-20 00:00:00'

注意运营商的细微差别。

答案 1 :(得分:3)

因为那是最接近的分钟。

鉴于它被定义为在29.998秒或更高的时间点,你还会得到什么结果呢?在23:58:30,你希望它能够回到23:59 - 为什么一分钟后行为会有所不同?

如果您想要更精确的日期/时间衡量,请使用datetimedatetime2 - 而不是nvarchar