<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      深入SQL Server 日期和時(shí)間的內(nèi)部存儲(chǔ)

      在SQL Server的內(nèi)部存儲(chǔ)中,日期和時(shí)間不是以字符串的形式存儲(chǔ)的,而是使用整數(shù)來存儲(chǔ)的。使用特定的格式來區(qū)分日期部分和時(shí)間部分的偏移量,并通過基準(zhǔn)日期和基準(zhǔn)時(shí)間來還原真實(shí)的數(shù)據(jù)。

      一,DateTime的內(nèi)部存儲(chǔ)

      SQL Server存儲(chǔ)引擎把DateTime類型存儲(chǔ)為2個(gè)int32類型,共8個(gè)字節(jié),第一個(gè)int32 整數(shù)(前4個(gè)字節(jié))存儲(chǔ)的是日期相對(duì)于基準(zhǔn)日期(1900-01-01)的偏移量。基準(zhǔn)日期是1900-01-01,當(dāng)前4 字節(jié)為0 時(shí),表示的日期是1900 年1 月1 日。第二個(gè)int32整數(shù)(后4個(gè)字節(jié))存儲(chǔ)的是午夜(00:00:00.000)之后的時(shí)鐘滴答數(shù),每個(gè)滴答為1?300秒,精確度為3.33毫秒(0.00333秒,3.33ms),因此,DateTime能夠表示的時(shí)間,可能會(huì)存在一個(gè)滴答的時(shí)間誤差。

      DateTime的內(nèi)部存儲(chǔ)格式,用十六進(jìn)制表示是:DDDDTTTT

      • DDDD:占用2個(gè)字節(jié),表示對(duì)基準(zhǔn)日期的偏移量
      • TTTT:占用兩個(gè)字節(jié),表示對(duì)午夜之后的始終滴答數(shù)

      舉個(gè)例子,對(duì)于如下的日期和時(shí)間,把DateTime類型轉(zhuǎn)換為大小為8個(gè)字節(jié)的16進(jìn)制,每?jī)蓚€(gè)數(shù)字對(duì)應(yīng)1個(gè)字節(jié):

      declare @dt datetime = '2015-05-07 10:05:23.187'
      select convert(varbinary(8), @dt) as date_time_binary
      --output 0x0000A49100A6463C

      1,拆分出date和time

      把時(shí)間的二進(jìn)制格式中的字節(jié)拆分成兩部分:前4個(gè)字節(jié)表示date,后4個(gè)字節(jié)表示time,得出的結(jié)果如下:

      復(fù)制代碼
      declare @dt datetime = '2015-05-07 10:05:23.187'
      
      select substring(convert(varbinary(8), @dt), 1, 4) as date_binary,
         cast(substring(convert(varbinary(8), @dt), 1, 4) as int) as date_int,
         substring(convert(varbinary(8), @dt), 5, 4) as time_binary,
         cast(substring(convert(varbinary(8), @dt), 5, 4) as int) as time_int;
      復(fù)制代碼

       2,通過偏移量還原日期和時(shí)間

      通過基準(zhǔn)時(shí)間和偏移量,把整數(shù)還原為原始的日期和時(shí)間:

      declare @Time time='00:00:00.000'
      declare @Date date='1900-01-01'
      
      select dateadd(day, 42129, @Date) as originl_date
          , dateadd(ms,10896956*10/3, @Time) as original_time

      二,DateTime2的內(nèi)部存儲(chǔ)

      DateTime2(n)數(shù)據(jù)類型存儲(chǔ)日期和時(shí)間,它是DateTime的升級(jí)版本,由于小數(shù)秒n的精度可以自主設(shè)置,其存儲(chǔ)大小(Storage Size)不固定,DateTime2(n)占用的存儲(chǔ)空間和小數(shù)秒的精度之間的關(guān)系是:

      • DateTime2(n)內(nèi)部存儲(chǔ)的第一個(gè)字節(jié)存儲(chǔ)精度n,后續(xù)的字節(jié)用于存儲(chǔ)日期和時(shí)間的值。
      • 當(dāng)小數(shù)秒的精度 n < 3 時(shí),總的存儲(chǔ)空間是1B(精度)+6 B(數(shù)據(jù));
      • 當(dāng)小數(shù)秒的精度 n 是 3 - 4 時(shí),總的存儲(chǔ)空間是1B(精度)+ 7B(數(shù)據(jù));
      • 當(dāng)小數(shù)秒的精度 n 是 5 - 7 時(shí),總的存儲(chǔ)空間是1B(精度)+ 8B(數(shù)據(jù)),最大的小數(shù)秒精度是7,默認(rèn)值是7;

      1,二進(jìn)制逆序

      在探索DateTime2(n)的內(nèi)部存儲(chǔ)之前,先了解一下字節(jié)存儲(chǔ)的“小端”格式和“大端”格式:

      • 大端格式:是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中;
      • 小端格式:是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中。

      舉個(gè)例子,假如內(nèi)存地址左邊是地位,右邊是高位,對(duì)于數(shù)字275,使用兩個(gè)字節(jié)來存儲(chǔ):

      • 如果采用大端格式:字節(jié)序列是0x0113
      • 如果采用小端格式:字節(jié)序列是0x1301

      DateTime2(n)的內(nèi)部存儲(chǔ)格式使用的是小端格式,這種格式適合CPU的運(yùn)算。

      2,DateTime2的存儲(chǔ)格式

      DateTime2(n)的內(nèi)部存儲(chǔ)格式是:

      • 第一字節(jié)存儲(chǔ)的精度n,
      • 后三個(gè)字節(jié)記錄從基準(zhǔn)日期0001-01-01之后的多少天,采用小端格式。
      • 中間余下的字節(jié)記錄子夜之后經(jīng)過的時(shí)間單位間隔(time unit interval,TUI)的數(shù)量,采用小端格式。

      TUI是由精度來控制的,每一個(gè)TUI是10的n次方之一秒,也就是:

      • 對(duì)于 DateTime2(7),TUI是100ns;
      • 對(duì)于 DateTime2(6),TUI是1微秒(=1000ns);
      • 對(duì)于 DateTime2(5),TUI是10微秒;
      • 對(duì)于 DateTime2(4),TUI是100微秒;
      • 對(duì)于 DateTime2(3),TUI是1ms(1毫秒=1000微秒);

      為了便于運(yùn)算,把DateTime2(n) 的字節(jié)流逆序排列:前3個(gè)字節(jié)表示的是天數(shù),最后一個(gè)字節(jié)表示的是精度,中間余下的字節(jié)表示的TUI的數(shù)量。例如,對(duì)于 DateTime2(7)按照字節(jié)流逆序處理之后,存儲(chǔ)空間是9個(gè)字節(jié):前三個(gè)字節(jié)是存儲(chǔ)的從基準(zhǔn)日期0001-01-01之后的多少天,最后一位是精度n,中間的5個(gè)字節(jié)表示從子夜開始有多少個(gè)TUI。

      2,把DateTime2轉(zhuǎn)換為二進(jìn)制存儲(chǔ)

      把DateTime2轉(zhuǎn)換為二進(jìn)制存儲(chǔ),并作逆序處理,DateTime2(3)的精度為3,存儲(chǔ)空間是8個(gè)字節(jié),后三個(gè)字節(jié)記錄從基準(zhǔn)日期0001-01-01之后的多少天,前3個(gè)字節(jié)表示從子夜開始有多少個(gè)TUI。

      declare @dt datetime2(3)='2015-05-07 10:05:23.187'
      declare @dt_bi varbinary(max)=convert(varbinary(max), @dt) 
      select @dt_bi as date_time_binary
          ,convert(varbinary(max),reverse(@dt_bi)) as reverse_binary

      把二進(jìn)制值拆分成DateTime2(3)的各個(gè)組成成分:

      復(fù)制代碼
      declare @dt datetime2(3)='2015-05-07 10:05:23.187'
      declare @dt_bi varbinary(max)=convert(varbinary(max), @dt) 
      declare @dt_bi_littleEnd varbinary(max)
      select @dt_bi_littleEnd=convert(varbinary(max),reverse(@dt_bi))
      
      select substring(convert(varbinary(8), @dt_bi_littleEnd), 1, 3) as date_binary,
         cast(substring(convert(varbinary(8), @dt_bi_littleEnd), 1, 3) as int) as date_int,
         substring(convert(varbinary(8), @dt_bi_littleEnd), 4, 4) as time_binary,
         cast(substring(convert(varbinary(8), @dt_bi_littleEnd), 4, 4) as int) as time_int,
         substring(convert(varbinary(8), @dt_bi_littleEnd), 8, 1) as precision_binary,
         cast(substring(convert(varbinary(8), @dt_bi_littleEnd), 8, 1) as int) as precision_int;
      復(fù)制代碼

      3,利用偏移量和基準(zhǔn)還原原始值

      有了偏移量,就可以在基準(zhǔn)日期和時(shí)間之上加上偏移量來獲得原始值:

      declare @Time time='00:00:00.000'
      declare @Date date='0001-01-01'
      
      select dateadd(day, 735724, @Date) as originl_date
          , dateadd(ms,36323187, @Time) as original_time

       

       

       

      參考文檔:

      What is the SQL Server 2008 DateTime2 Internal Structure?

      How to Get SQL Server Dates and Times Horribly Wrong

      作者悅光陰
      posted @ 2022-03-15 21:27  竹樓風(fēng)雨聲  閱讀(586)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 久久久久无码中| 宁武县| 精品乱码一区二区三四五区 | 超清无码一区二区三区| 风韵丰满妇啪啪区老老熟女杏吧| 国产成人精品成人a在线观看| 婷婷五月综合激情| 亚洲精品一二三伦理中文| 亚洲av日韩av永久无码电影| 亚洲色一色噜一噜噜噜| 高潮喷水抽搐无码免费| 国产成人8x视频一区二区| av一本久道久久综合久久鬼色 | 国产AV巨作丝袜秘书| 最新AV中文字幕无码专区| 97成人碰碰久久人人超级碰oo| 久久国内精品自在自线91| 国产精品久久久一区二区三区| 国产情侣草莓视频在线| 亚洲精品一区二区三区大| 中文字幕国产精品二区| 好吊妞人成视频在线观看| 亚洲乱码中文字幕小综合| 国产福利酱国产一区二区| 亚洲色大成网站www在线| 临沭县| 中文字幕乱码一区二区免费| 久久91精品牛牛| 国产精品剧情亚洲二区| 日韩va中文字幕无码电影| 精品久久人人妻人人做精品| 亚洲悠悠色综合中文字幕| 一区二区亚洲人妻精品| 国产成熟女人性满足视频| 五月天国产成人av免费观看| 亚洲av网一区天堂福利| 免费人妻无码不卡中文18禁| 天堂国产一区二区三区四区不卡| 鲁一鲁一鲁一鲁一澡| 内射干少妇亚洲69xxx| 人妻有码中文字幕在线|