• 【原创】C# 计时周期数(Ticks)在不同数据库上的实现


    动手之前,先来看看 Ticks 在微软官方文档上的定义:

    注解
    一个计时周期表示一百纳秒,即一千万分之一秒。 1 毫秒内有 10,000 个计时周期,即 1 秒内有 1,000 万个计时周期。
    此属性的值表示自0001年1月1日午夜 12:00:00 0:00:00 (公历日期为0001年1月1日,UTC 时间为公历)的100纳秒间隔数,表示 DateTime.MinValue。 它不包括由闰秒组成的计时周期数。

    从上面的定义可知,1tick = 100纳秒,另外要弄明白几个时间单位的转换规则:
    1秒 = 1000毫秒
    1毫秒 = 1000微妙
    1微秒 = 1000纳秒
    1tick=100纳秒
    1微秒=10tick

      计算公式:Ticks = (1970年01月01日00:00:00  ~ DateTime ) 的刻度值  + 621355968000000000,其中 621355968000000000 表示从 0000年00月00日00:00:00 ~ 1970年01月01日00:00:00的刻度值。下面以 2019-11-06 12:11:11.1234567 这个时间为例,演示在不同数据库上计算 Tick 的实现。

    SqlServer 中的实现

    SELECT (DATEDIFF_BIG(NANOSECOND,'1970-01-01','2019-11-06 12:11:11.1234567') / 100 + 621355968000000000) AS Ticks
    -- 637086390711234567

    MySQL 中的实现:

    SELECT (TIMESTAMPDIFF(MICROSECOND,'1970-01-01','2019-11-06 12:11:11.1234560') * 10 + 621355968000000000) AS Ticks
    -- 637086390711234560
    -- 注意:MySQL 时间的小数位最大仅支持 6 位

    Oracle 中的实现

    SELECT
    (((TRUNC(TO_TIMESTAMP('2019-11-06 12:11:11.1234567','yyyy-mm-dd hh24:mi:ss.ff')) - TO_DATE('1970-01-01','yyyy-mm-dd')) * 86400000 
    + TO_NUMBER(TO_CHAR(TO_TIMESTAMP('2019-11-06 12:11:11.1234567','yyyy-mm-dd hh24:mi:ss.ff'),'hh24')) * 3600000 
    + TO_NUMBER(TO_CHAR(TO_TIMESTAMP('2019-11-06 12:11:11.1234567','yyyy-mm-dd hh24:mi:ss.ff'),'mi')) * 60000 
    + TO_NUMBER(TO_CHAR(TO_TIMESTAMP('2019-11-06 12:11:11.1234567','yyyy-mm-dd hh24:mi:ss.ff'),'ss')) * 1000) * 10000 
    + TO_NUMBER(TO_CHAR(TO_TIMESTAMP('2019-11-06 12:11:11.1234567','yyyy-mm-dd hh24:mi:ss.ff'),'ff7')) 
    + 621355968000000000) AS Ticks
    FROM DUAL;
    -- 637086390711235000

    PostgreSQL 中的实现

    SELECT 
    ((((DATE_TRUNC('DAY','2019-11-06 12:11:11.1234560'::TIMESTAMP)::DATE - '1970-01-01'::DATE) * 86400000::BIGINT 
    + DATE_PART('HOUR', '2019-11-06 12:11:11.1234560'::TIMESTAMP) * 3600000 
    + DATE_PART('MINUTE', '2019-11-06 12:11:11.1234560'::TIMESTAMP) * 60000) * 10000 
    + DATE_PART('MICROSECOND', '2019-11-06 12:11:11.1234560'::TIMESTAMP) * 10)::BIGINT 
    + 621355968000000000::BIGINT) AS Ticks
    -- 637086390711234560 
    -- 注意:PostgreSQL 时间的小数位最大仅支持 6

    看,最终运行结果与在 C# 代码里运行的结果都是一致的。

    技术交流群:816425449

  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/yiting/p/11804611.html
Copyright © 2020-2023  润新知