亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:48:58
字體:
來源:轉載
供稿:網友
解剖SQLSERVER 第四篇 OrcaMDF里對dates類型數據的解析(譯)解剖SQLSERVER 第四篇 OrcaMDF里對dates類型數據的解析(譯)

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

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

SqlDate實現

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

默認值是1900-01-01

比較坑爹的是.NET里面還沒有任何標準實現能夠支持3個字節的整數類型,只有short類型和int類型,但是,他們要不太大要不太小

另外,要正確讀取日期值,對于.NET的4字節整型我們必須執行一些轉變去獲取正確的數字

一旦我們獲取到date的值,我們可以創建一個默認的datetime類型并且添加天數進去

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);    }}

相關測試

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<ArgumentException>(() => type.GetValue(new byte[2]));Assert.Throws<ArgumentException>(() => type.GetValue(new byte[4]));}}}

SqlDateTime實現

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

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

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

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

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

要執行一些轉換 (包括取模和相除)

部分     計算小時   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);    }}

相關測試

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<ArgumentException>(() => type.GetValue(new byte[9]));Assert.Throws<ArgumentException>(() => type.GetValue(new byte[7]));}}}

SqlSmallDateTime實現

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

大多數場景下,精確到秒已經足夠了,在一個范圍的時間間隔內和精確值不需要太精確的情況下會節省很多空間

smalldatetime 數據類型會只占用4個字節,前2個字節存儲自午夜的分鐘數,后2個字節存儲日期,默認值是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);    }}

相關測試

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<ArgumentException>(() => type.GetValue(new byte[3]));Assert.Throws<ArgumentException>(() => type.GetValue(new byte[5]));}}}

第四篇完


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成**性毛茸茸| 国产精品老女人视频| 成人免费视频xnxx.com| 深夜福利国产精品| 亚洲午夜精品视频| 国产热re99久久6国产精品| 亚洲欧美日韩成人| 欧美午夜精品久久久久久人妖| 国产亚洲精品一区二555| 亚洲人成电影网站色| 国产精品亚洲自拍| 81精品国产乱码久久久久久| 超薄丝袜一区二区| 永久免费精品影视网站| 97国产精品视频人人做人人爱| 国产亚洲精品一区二555| 日韩在线观看你懂的| 成人免费福利在线| 日韩在线免费视频观看| 国产精品视频免费观看www| 国产午夜精品免费一区二区三区| 日韩欧美在线网址| 色悠悠国产精品| 国产一区二区在线播放| 国产日韩欧美在线看| 久久夜色撩人精品| 国产69久久精品成人| 日韩av电影国产| 欧美一乱一性一交一视频| 久久在线视频在线| 国产精品999| 日韩在线播放av| 狠狠操狠狠色综合网| 国产一级揄自揄精品视频| 中国人与牲禽动交精品| 国产一区二区香蕉| 45www国产精品网站| 成人xvideos免费视频| 欧美麻豆久久久久久中文| 国产在线观看精品一区二区三区| 欧美成人一区二区三区电影| 欧美日韩亚洲精品一区二区三区| 黑人巨大精品欧美一区二区三区| 中文字幕日韩欧美精品在线观看| 国产精品久久久久久婷婷天堂| 一本一本久久a久久精品综合小说| 国产一区二区视频在线观看| 日韩在线www| 亚洲第一福利在线观看| 在线观看欧美www| 日韩av在线免费观看一区| 日韩欧美中文字幕在线播放| 国产精品综合不卡av| 国产精品人人做人人爽| 2021国产精品视频| 欧美性xxxxxxxxx| 日韩欧美在线视频日韩欧美在线视频| 亚洲欧美中文字幕在线一区| 欧美巨猛xxxx猛交黑人97人| 欧美黄色片免费观看| 中文字幕精品国产| 国产精品∨欧美精品v日韩精品| 国产一区二区三区久久精品| 亚洲女人天堂色在线7777| 欧美久久精品一级黑人c片| 国产一区二区三区精品久久久| 久久综合色影院| 97视频色精品| 久久久久久一区二区三区| 92福利视频午夜1000合集在线观看| 成人国产精品免费视频| 成人网欧美在线视频| www.日韩免费| 久久人91精品久久久久久不卡| 日韩电影大全免费观看2023年上| 91av视频在线免费观看| 欧美激情亚洲激情| 中文字幕无线精品亚洲乱码一区| 欧美激情成人在线视频| 亚洲午夜精品久久久久久久久久久久| 亚洲综合小说区| 亚洲欧美日韩国产中文专区| 欧美天天综合色影久久精品| 秋霞午夜一区二区| 国外成人在线视频| 日韩欧美国产骚| 亚洲自拍偷拍网址| 1769国产精品| 青青久久av北条麻妃海外网| 欧美最顶级丰满的aⅴ艳星| 91免费看片网站| 国产精品丝袜白浆摸在线| 亚洲一区二区福利| 欧美激情视频在线免费观看 欧美视频免费一| 一级做a爰片久久毛片美女图片| 亚洲国内高清视频| 久久精品电影网站| 欧美综合激情网| 国产91精品最新在线播放| 成人黄色片网站| 日韩a**中文字幕| 国产一区红桃视频| 久久久久久久成人| 欧美激情喷水视频| 欧美丝袜第一区| 亚洲性av在线| 日韩在线高清视频| 亚洲精品视频免费| 精品久久久久久中文字幕| 日本久久久久久久| 久久人人爽亚洲精品天堂| 精品日韩美女的视频高清| 欧美www视频在线观看| 日韩免费在线视频| 欧美亚洲一级片| 欧美一区二粉嫩精品国产一线天| 欧美激情一区二区三区在线视频观看| 亚洲国产精品国自产拍av秋霞| 久久精品99国产精品酒店日本| 久久久av免费| 成人乱色短篇合集| 亚洲成在人线av| 欧美电影免费观看高清| 国产精品精品视频一区二区三区| 欧美最猛性xxxxx免费| 欧美另类69精品久久久久9999| 日韩精品在线观看网站| 91国自产精品中文字幕亚洲| 亚洲色图狂野欧美| 久久国产视频网站| 国产精品都在这里| 久久大大胆人体| 国产精品极品美女粉嫩高清在线| 超碰精品一区二区三区乱码| 欧美视频在线免费看| 狠狠色狠狠色综合日日五| 亚洲免费电影在线观看| 精品久久久久久国产| 欧美成人黑人xx视频免费观看| xx视频.9999.com| 欧美肥臀大乳一区二区免费视频| 国产精品白嫩美女在线观看| 国产精品久久久久久av福利| 欧美午夜精品久久久久久浪潮| 日产日韩在线亚洲欧美| 中文字幕欧美国内| 成人字幕网zmw| 亚洲人成免费电影| 精品无人国产偷自产在线| 91精品啪aⅴ在线观看国产| 91中文字幕在线观看| 日本精品免费观看| 国产亚洲美女久久| 国产精品欧美日韩一区二区| 欧美成人在线影院| 成人av.网址在线网站| 亚洲国产精品福利| 亚洲精品电影在线| 18性欧美xxxⅹ性满足| 亚洲韩国日本中文字幕| 青青草原成人在线视频| 国产黑人绿帽在线第一区| 亚洲国产成人精品久久久国产成人一区| 不卡伊人av在线播放|