首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DATEDIFF溢出

DATEDIFF溢出
EN

Stack Overflow用户
提问于 2020-01-30 10:16:31
回答 1查看 409关注 0票数 0

我在中使用以下代码

代码语言:javascript
复制
SELECT cast(DATEDIFF(ms,cast(Start as datetime2),cast(EndTime as datetime2)
                        ) as float) AS [total]--difference to be calculated in millisecond
        FROM systable

但是遇到一个错误,因为“datediff函数导致溢出。分隔两个日期/时间实例的日期部分的数量太大了。请尝试将datediff与不太精确的datepart一起使用。”

我的要求是有不同的毫秒,如果这改变了,那么它将影响其他结果。

请你提供一些帮助

EN

回答 1

Stack Overflow用户

发布于 2020-01-30 17:49:45

这是因为DATEDIFF()函数返回一个整数。整数只允许值高达2,147,483,647。在这种情况下,导致数据类型溢出的值超过了2B。理想情况下,您应该使用大()函数,它返回一个比金,该函数允许的值最多为9,223,372,036,854,775,807或~9七十七千。DATEDIFF_BIG()在/中不受支持(截止到2020年1月)。

您可以在这里投票支持该功能:(https://feedback.azure.com/forums/307516/suggestions/14781627)

通过测试DATEDIFF(),您可以看到,在没有整数之前,您可以得到25天和20个小时的日期差。下面是一些示例代码。

代码语言:javascript
复制
DECLARE @startdate DATETIME2 = '01/01/2020 00:00:00.0000';
DECLARE @enddate DATETIME2   = '01/01/2020 00:00:02.0000';

-- Support:
--   MILLISECOND:    ~25 days 20 Hours
--   MICROSECOND:    ~35 minutes
--   NANOSECOND:     ~ 2 seconds

SELECT
    DATEDIFF(DAY, @startdate, @enddate)             [day]
    , DATEDIFF(HOUR, @startdate, @enddate)          [hour]
    , DATEDIFF(MINUTE, @startdate, @enddate)        [minute]
    , DATEDIFF(SECOND, @startdate, @enddate)        [second]
    , DATEDIFF(MILLISECOND, @startdate, @enddate)   [millisecond]
    , DATEDIFF(MICROSECOND, @startdate, @enddate)   [microsecond]
    , DATEDIFF(NANOSECOND, @startdate, @enddate)    [nanosecond]

在此期间,您可以计算每个值从时间开始以来的滴答数,然后减去差额。对于一个DATETIME2,可以像这样计算蜱数:

代码语言:javascript
复制
CREATE FUNCTION dbo.DATEDIFF_TICKS(@date DATETIME2)
RETURNS BIGINT
AS
BEGIN

    RETURN
        (DATEDIFF(DAY, '01/01/0001', CAST(@date AS DATE)) * 864000000000.0)
        + (DATEDIFF(SECOND, '00:00', CAST(@date AS TIME(7))) * 10000000.0)
        + (DATEPART(NANOSECOND, @date) / 100.0);
END
GO

然后,您只需运行该函数并确定滴答和滴答之间的差异。

代码语言:javascript
复制
DECLARE @startdate DATETIME2 = '01/01/2020 00:00:00.0000';
DECLARE @enddate DATETIME2 = '01/30/2020 00:00:00.0000';

SELECT
    dbo.DATEDIFF_TICKS(@startdate)      [start_ticks],
    dbo.DATEDIFF_TICKS(@startdate)      [end_ticks],
    dbo.DATEDIFF_TICKS(@enddate) - dbo.DATEDIFF_TICKS(@startdate) [diff];

下面是一个运行500年差异的示例:

代码语言:javascript
复制
DECLARE @startdate DATETIME2 = '01/01/2000 00:00:00.0000';
DECLARE @enddate DATETIME2 = '01/01/2500 00:00:00.0000';

SELECT
    dbo.DATEDIFF_TICKS(@startdate)      [start_ticks],
    dbo.DATEDIFF_TICKS(@startdate)      [end_ticks],

    dbo.DATEDIFF_TICKS(@enddate) - dbo.DATEDIFF_TICKS(@startdate) [diff];

结果:

代码语言:javascript
复制
start_ticks          end_ticks            diff
-------------------- -------------------- --------------------
630822816000000000   630822816000000000   157785408000000000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59983672

复制
相关文章

相似问题

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