【问题标题】:SQL date format [h]:mm:ss like Excel does, beyond 24 hrSQL 日期格式 [h]:mm:ss 像 Excel 一样,超过 24 小时
【发布时间】:2013-02-06 22:07:29
【问题描述】:

在 T-SQL 或任何 SQL 平台中有 Excel 内置日期 格式 [h]:mm:ss 的翻译吗?

示例:

    General [h]:mm:ss   [mm]:ss     [ss]
   1.00000  24:00:00    1440:00         86400
   1.00000  24:00:00    1440:00         86400

总和

   2.00000  48:00:00    2880:00         172800

对于 T-SQL 我会选择

Without century (yy) (1)    With century (yyyy) Standard    Input/Output (3)
  14                             114                   -    hh:mi:ss:mmm(24h)

或者默认为 108,我认为我是否必须重新创建一个可以执行以下操作的函数 hh:mi:ss:mmm(+24h)?

欢迎评论;

【问题讨论】:

    标签: sql tsql format sql-date-functions


    【解决方案1】:

    虽然 SQL Server 的 time 数据类型应该为 map to the CLR's timespan datatype,但它只支持小于 24 小时的间隔。

    SQL Server 的datediff 在计算间隔时也很棘手,因为它计算两个日期时间之间的datepart 边界。例如,这应该是 1 秒的间隔,但如果您询问小时数,datediff 会告诉您这是一个小时:

    select datediff(hh, '2013-01-01T23:59:59', '2013-01-02T00:00:00')
    -- Returns 1
    

    因此,当涉及到这一点时,您可能必须推出自己的功能,但希望 this answer 可以帮助您开始:

    -- Setup test data
    declare @minDate datetime = '2012-12-12 20:16:47.160'
    declare @maxDate datetime = '2012-12-17 15:10:12.050'
    
    -- Get timespan in hh:mi:ss
    select cast(
            (cast(cast(@maxDate as float) - cast(@minDate as float) as int) * 24) /* hours over 24 */
            + datepart(hh, @maxDate - @minDate) /* hours */
            as varchar(10))
        + ':' + right('0' + cast(datepart(mi, @maxDate - @minDate) as varchar(2)), 2) /* minutes */
        + ':' + right('0' + cast(datepart(ss, @maxDate - @minDate) as varchar(2)), 2) /* seconds */
    
    -- Returns 114:53:24
    

    【讨论】:

    • 将尝试这个,与我的合作伙伴交谈,看看如何实现它,因为我们已经有了十进制数据,但确实是一个好的开始!
    • 我永远不会想到 T-SQL time 应该映射到客户端的时间跨度类型。我一直认为它是一个时间点,就像 datetimedatetime2 但没有日期部分。感谢您提供的链接,它让我大开眼界(或者说开阔了)。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多