• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

    解剖SQLSERVER第四篇OrcaMDF里對dates類型數(shù)據(jù)的解析(譯)

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-09 07:59:41
    文檔

    解剖SQLSERVER第四篇OrcaMDF里對dates類型數(shù)據(jù)的解析(譯)

    解剖SQLSERVER第四篇OrcaMDF里對dates類型數(shù)據(jù)的解析(譯):解剖SQLSERVER 第四篇 OrcaMDF里對dates類型數(shù)據(jù)的解析(譯) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有幾種不同的date相關(guān)類型,當(dāng)前OrcaMDF 支持三種最常用的date類型:date,datetime,smalldatetim
    推薦度:
    導(dǎo)讀解剖SQLSERVER第四篇OrcaMDF里對dates類型數(shù)據(jù)的解析(譯):解剖SQLSERVER 第四篇 OrcaMDF里對dates類型數(shù)據(jù)的解析(譯) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有幾種不同的date相關(guān)類型,當(dāng)前OrcaMDF 支持三種最常用的date類型:date,datetime,smalldatetim

    解剖SQLSERVER 第四篇 OrcaMDF里對dates類型數(shù)據(jù)的解析(譯) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有幾種不同的date相關(guān)類型,當(dāng)前OrcaMDF 支持三種最常用的date類型:date,datetime,smalldatetime SqlDate實現(xiàn) date 類型在三種

    解剖SQLSERVER 第四篇 OrcaMDF里對dates類型數(shù)據(jù)的解析(譯)

    http://improve.dk/parsing-dates-in-orcamdf/

    在SQLSERVER里面有幾種不同的date相關(guān)類型,當(dāng)前OrcaMDF 支持三種最常用的date類型:date,datetime,smalldatetime

    SqlDate實現(xiàn)

    date 類型在三種類型之中是最簡單的,他是一個3個字節(jié)的定長類型,存儲了日期值它支持的日期范圍從0001-01-01到9999-12-31

    默認(rèn)值是1900-01-01

    比較坑爹的是.NET里面還沒有任何標(biāo)準(zhǔn)實現(xiàn)能夠支持3個字節(jié)的整數(shù)類型,只有short類型和int類型,但是,他們要不太大要不太小

    另外,要正確讀取日期值,對于.NET的4字節(jié)整型我們必須執(zhí)行一些轉(zhuǎn)變?nèi)カ@取正確的數(shù)字

    一旦我們獲取到date的值,我們可以創(chuàng)建一個默認(rèn)的datetime類型并且添加天數(shù)進去

    public class SqlDate : ISqlType
    {
     public bool IsVariableLength
     {
     get { return false; }
     }
    
     public short? FixedLength
     {
     get { return 3; }
     }
    
     public object GetValue(byte[] value)
     {
     if (value.Length != 3)
     throw new ArgumentException("Invalid value length: " + value.Length);
    
     // Magic needed to read a 3 byte integer into .NET's 4 byte representation.
     // Reading backwards due to assumed little endianness.
     int date = (value[2] << 16) + (value[1] << 8) + value[0];
    
     return new DateTime(1, 1, 1).AddDays(date);
     }
    }

    相關(guān)測試

    using System;
    using NUnit.Framework;
    using OrcaMDF.Core.Engine.SqlTypes;
    namespace OrcaMDF.Core.Tests.Engine.SqlTypes
    {
     [TestFixture]
    public class SqlDateTests
    {
     [Test]
    public void GetValue()
    {
    var type = new SqlDate();
    var input = new byte[] { 0xf6, 0x4c, 0x0b };
    Assert.AreEqual(new DateTime(2028, 09, 09), Convert.ToDateTime(type.GetValue(input)));
    input = new byte[] { 0x71, 0x5c, 0x0b };
    Assert.AreEqual(new DateTime(2039, 07, 17), Convert.ToDateTime(type.GetValue(input)));
    }
     [Test]
    public void Length()
    {
    var type = new SqlDate();
    Assert.Throws(() => type.GetValue(new byte[2]));
    Assert.Throws(() => type.GetValue(new byte[4]));
    }
    }
    }

    SqlDateTime實現(xiàn)

    date類型只能存儲日期,而datetime類型不但能存儲date也能存儲time

    datetime存儲8字節(jié)定長數(shù)據(jù)值,第一部分是time(4字節(jié)),而第二部分是date(4字節(jié))

    計算date部分跟上面介紹date類型基本上一樣,不過這一次date部分是一個四字節(jié)整數(shù),比上面的例子容易處理多了,上面的date類型是3個字節(jié)

    time部分存儲為自午夜時的ticks數(shù),一個tick就是1/300th 秒,為了顯示tick值,我們首先定義一個常量,常量值是10d/3d

    time的各個部分實際同樣存儲在同一個整型值里面(比如時間,分鐘,秒,毫秒),所以我們要獨立訪問這些單獨的部分,我們必須

    要執(zhí)行一些轉(zhuǎn)換 (包括取模和相除)

    部分 計算
    小時 X / 300 / 60 / 60
    分鐘 X / 300 / 60 % 60
    秒 X / 300 % 60
    毫秒 X % 300 * 10d / 3d

    public class SqlDateTime : ISqlType
    {
     private const double CLOCK_TICK_MS = 10d/3d;
    
     public bool IsVariableLength
     {
     get { return false; }
     }
    
     public short? FixedLength
     {
     get { return 8; }
     }
    
     public object GetValue(byte[] value)
     {
     if (value.Length != 8)
     throw new ArgumentException("Invalid value length: " + value.Length);
    
     int time = BitConverter.ToInt32(value, 0);
     int date = BitConverter.ToInt32(value, 4);
    
     return new DateTime(1900, 1, 1, time/300/60/60, time/300/60%60, time/300%60, (int)Math.Round(time%300*CLOCK_TICK_MS)).AddDays(date);
     }
    }

    相關(guān)測試

    using System;
    using NUnit.Framework;
    using OrcaMDF.Core.Engine.SqlTypes;
    namespace OrcaMDF.Core.Tests.Engine.SqlTypes
    {
     [TestFixture]
    public class SqlDateTimeTests
    {
     [Test]
    public void GetValue()
    {
    var type = new SqlDateTime();
    byte[] input;
    input = new byte[] { 0x5e, 0x3b, 0x5d, 0x00, 0x25, 0x91, 0x00, 0x00 };
    Assert.AreEqual(new DateTime(2001, 09, 25, 05, 39, 26, 820), (DateTime)type.GetValue(input));
    input = new byte[] { 0xb6, 0x87, 0xf0, 0x00, 0xd1, 0x8b, 0x00, 0x00 };
    Assert.AreEqual(new DateTime(1997, 12, 31, 14, 35, 44, 607), (DateTime)type.GetValue(input));
    input = new byte[] { 0x2d, 0xfd, 0x1c, 0x01, 0x4a, 0x75, 0x00, 0x00 };
    Assert.AreEqual(new DateTime(1982, 03, 18, 17, 17, 36, 790), (DateTime)type.GetValue(input));
    input = new byte[] { 0xff, 0x81, 0x8b, 0x01, 0x7f, 0x24, 0x2d, 0x00 };
    Assert.AreEqual(new DateTime(9999, 12, 31, 23, 59, 59, 997), (DateTime)type.GetValue(input));
    }
     [Test]
    public void Length()
    {
    var type = new SqlDateTime();
    Assert.Throws(() => type.GetValue(new byte[9]));
    Assert.Throws(() => type.GetValue(new byte[7]));
    }
    }
    }

    SqlSmallDateTime實現(xiàn)

    Smalldatetime 是一個不錯的數(shù)據(jù)類型當(dāng)你需要存儲范圍值內(nèi)的日期值(1900~2079)并且他能精確到秒

    大多數(shù)場景下,精確到秒已經(jīng)足夠了,在一個范圍的時間間隔內(nèi)和精確值不需要太精確的情況下會節(jié)省很多空間

    smalldatetime 數(shù)據(jù)類型會只占用4個字節(jié),前2個字節(jié)存儲自午夜的分鐘數(shù),后2個字節(jié)存儲日期,默認(rèn)值是1900-1-1

    處理的方法跟datetime差不多,只不過使用更小的范圍

    部分 計算
    小時 X / 60
    分鐘 X % 60

    public class SqlSmallDateTime : ISqlType
    {
     public bool IsVariableLength
     {
     get { return false; }
     }
    
     public short? FixedLength
     {
     get { return 4; }
     }
    
     public object GetValue(byte[] value)
     {
     if (value.Length != 4)
     throw new ArgumentException("Invalid value length: " + value.Length);
    
     ushort time = BitConverter.ToUInt16(value, 0);
     ushort date = BitConverter.ToUInt16(value, 2);
    
     return new DateTime(1900, 1, 1, time / 60, time % 60, 0).AddDays(date);
     }
    }

    相關(guān)測試

    using System;
    using NUnit.Framework;
    using OrcaMDF.Core.Engine.SqlTypes;
    namespace OrcaMDF.Core.Tests.Engine.SqlTypes
    {
     [TestFixture]
    public class SqlSmallDateTimeTests
    {
     [Test]
    public void GetValue()
    {
    var type = new SqlSmallDateTime();
    var input = new byte[] { 0xab, 0x02, 0x5d, 0x26 };
    Assert.AreEqual(new DateTime(1926, 11, 22, 11, 23, 0), Convert.ToDateTime(type.GetValue(input)));
    input = new byte[] { 0x49, 0x03, 0x99, 0x09 };
    Assert.AreEqual(new DateTime(1906, 9, 24, 14, 1, 0), Convert.ToDateTime(type.GetValue(input)));
    }
     [Test]
    public void Length()
    {
    var type = new SqlSmallDateTime();
    Assert.Throws(() => type.GetValue(new byte[3]));
    Assert.Throws(() => type.GetValue(new byte[5]));
    }
    }
    }

    第四篇完

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    解剖SQLSERVER第四篇OrcaMDF里對dates類型數(shù)據(jù)的解析(譯)

    解剖SQLSERVER第四篇OrcaMDF里對dates類型數(shù)據(jù)的解析(譯):解剖SQLSERVER 第四篇 OrcaMDF里對dates類型數(shù)據(jù)的解析(譯) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有幾種不同的date相關(guān)類型,當(dāng)前OrcaMDF 支持三種最常用的date類型:date,datetime,smalldatetim
    推薦度:
    標(biāo)簽: 數(shù)據(jù) 解析 第四
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 无码精品人妻一区二区三区漫画| 亚洲精品国产精品乱码不99| 免费观看四虎精品成人| 性欧洲精品videos| 国产精品无码一区二区在线| 国产亚洲精品国看不卡| 国产精品亚洲玖玖玖在线观看| 午夜精品射精入后重之免费观看| 国产高清在线精品一本大道| 国产精品无码专区| 亚洲永久精品ww47| 久久精品成人| 国产精品99无码一区二区| 国产成人精品手机在线观看| 日韩欧美亚洲国产精品字幕久久久 | 国产精品视频网站你懂得| 午夜不卡久久精品无码免费| 欧美精品色婷婷五月综合| 国产精品无码久久四虎| 91精品国产品国语在线不卡| 九九热在线精品视频| heyzo高无码国产精品| 无码人妻精品一区二区三区夜夜嗨| 久久精品无码一区二区三区日韩| 国产精品美女久久久网AV| 91精品婷婷国产综合久久| 日本久久久精品中文字幕| 99精品久久久久中文字幕| 国产人妖乱国产精品人妖| 国精品午夜福利视频不卡麻豆| 久久亚洲日韩精品一区二区三区| 日韩国产成人精品视频| 亚洲国产另类久久久精品小说| 亚洲国产精品一区二区第一页免 | 久久久久亚洲精品男人的天堂| 91精品久久久久久无码| 91在线手机精品超级观看| 成人精品一区二区三区免费看| 99精品国产成人一区二区| 一区二区三区精品国产欧美| 四虎国产精品永久一区|