小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【原創(chuàng)】C# 計(jì)時(shí)周期數(shù)(Ticks)在不同數(shù)據(jù)庫上的實(shí)現(xiàn)

 Coder編程 2020-05-12

動(dòng)手之前,先來看看 Ticks 在微軟官方文檔上的定義:

注解一個(gè)計(jì)時(shí)周期表示一百納秒,即一千萬分之一秒。 1 毫秒內(nèi)有 10,000 個(gè)計(jì)時(shí)周期,即 1 秒內(nèi)有 1,000 萬個(gè)計(jì)時(shí)周期。
此屬性的值表示自0001年1月1日午夜 12:00:00 0:00:00 (公歷日期為0001年1月1日,UTC 時(shí)間為公歷)的100納秒間隔數(shù),表示 DateTime.MinValue。 它不包括由閏秒組成的計(jì)時(shí)周期數(shù)。

從上面的定義可知,1tick = 100納秒,另外要弄明白幾個(gè)時(shí)間單位的轉(zhuǎn)換規(guī)則:
1秒 = 1000毫秒
1毫秒 = 1000微妙
1微秒 = 1000納秒
1tick=100納秒
1微秒=10tick

  計(jì)算公式: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 這個(gè)時(shí)間為例,演示在不同數(shù)據(jù)庫上計(jì)算 Tick 的實(shí)現(xiàn)。

SqlServer 中的實(shí)現(xiàn)

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

MySQL 中的實(shí)現(xiàn):

SELECT (TIMESTAMPDIFF(MICROSECOND,'1970-01-01','2019-11-06 12:11:11.1234560') * 10 + 621355968000000000) AS Ticks-- 637086390711234560
-- 注意:MySQL 時(shí)間的小數(shù)位最大僅支持 6 位

Oracle 中的實(shí)現(xiàn)

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 中的實(shí)現(xiàn)

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 時(shí)間的小數(shù)位最大僅支持 6

 

看,最終運(yùn)行結(jié)果與在 C# 代碼里運(yùn)行的結(jié)果都是一致的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多