.NET Core 1.1日期解析無APi、SQL Server資料轉換JSON

來源:互聯網
上載者:User

標籤:ima   work   作業   primary   creat   tab   建立   日期   name   

前言

在大量匯入Excel中的資料時發現出生日期為整數也就是為天數,結果倒騰了翻,這是其一,其二是資料庫中的某一列存的是JSON資料,但是情境是為了作為作業來運行,此時不得不將篩選出的資料手動拼接成JSON,給需要的童鞋鋪一點路。

日期問題

在Excel中我們給出的出生日期則是正確的日期格式,比如如下:

但是呢,當我們匯入資料時發現將其日期轉換成了天數,這其實也沒什麼問題,但是項目是在.NET Core中,則出現了一點問題,在.NET Framework中,如果我們擷取到的出生日期是double型數字即天數時,我們該如何將其轉換為對應的日期呢,請看如下:

 var birthDate = DateTime.FromOADate(33243);

 

此時我們通過 DateTime.FromOADate 方法能夠解析出日期,下面我們再來看看目前.NET Core版本為1.1中的情況:

此時你會發現如下在.NET Core 1.1中並未有此方法。

既然在Excel匯入時為天數我們將日期添加天數不就行了嗎,在NET Core 1.1中只能通過手動去轉換了。我們來看下:

 var birthDate = DateTime.Now.AddDays(-33243);

此時得到的日期如下:

我們上述通過.NET Framework中的得到的日期為 1991-01-05 而此時得到的卻為 1992-03-06 ,轉換失敗。上述我們是通過當前日期去減去天數導致轉換失敗,此時我們改變思路,從某個日期加上這個日期是不是就可以了呢。日期最小從 1899-12-31 開始,所以我們接下來進行下操作:

var birthDate = new DateTime(1899, 12, 31).AddDays(33509);

此時得到的結果如下:

上述示範得到的結果為 1991-09-29 ,而我們在Excel中的日期為 1991-09-28 後經過查閱資料發現,這個是Excel中的一個Bug,此時我們還需要進行如下操作才行。

            var days = 33509;            if(days>59)                days-=1;            var birthDate = new DateTime(1899, 12, 31).AddDays(days);

在Excel中的日期多加了一天,類似如下:

想到這裡,從正向角度去看待,Excel中我們定義為日期型,而為何會進行轉換為天數了呢,我們看看Excel中格式設定。

原來是這樣,預設是常規,那麼我們是否可以設定自訂日期格式呢。

我們自訂格式為日期格式就不用再去讀取時進行轉換了,豈不爽哉,我們看看結果:

 

無論是從根本和利用代碼去轉換皆可解決問題,上述我們從Excel問題出發估計還保險一點。

SQL Server資料轉換為JSON

利用代碼轉換為JSON簡直是SO EASY。但是上述也已經表明了情境,直接通過預存程序篩選資料並將資料存放區為JSON字串來進行簡訊通知,下面我們來看看,建立測試表。

CREATE TABLE ProductList (Id INT IDENTITY(1,1) PRIMARY KEY, ProductName VARCHAR(500), Price NUMERIC(18,2), Quantity INT, Inserton DATETIME)

插入測試資料:

INSERT INTO  ProductList        (        ProductName,        Price,        quantity,        Inserton        ) VALUES (‘Digital camera‘,20000,5,getdate()),(‘Laptop‘,10000,5,getdate())

接下來我們要將其先轉換為XML,通過FOR XML PATH,如下:

SELECT * FROM ProductList FOR XML PATH(‘Jeffcky‘)

上述就無需我再多講,FOR XML PATH參數定義為XML根節點名稱

展開XML,則是如下XML資料

在SQL Server 2016有了對JSON解析的支援還是挺好,在SQL Server 2012中沒有只能借用STUFF函數來拼接了。

DECLARE @content VARCHAR(MAX)SET @content = (SELECT ‘[‘+ STUFF((SELECT TOP 2 ‘,{"ProductName": "‘ + ProductName + ‘","Price": "‘ + CONVERT(VARCHAR, Price) + ‘","Quantity": "‘ + CONVERT(VARCHAR, quantity) + ‘","Inserton": "‘ + CONVERT(VARCHAR, Inserton, 105) + ‘"}‘ FROM ProductList  FOR XML PATH(‘‘)), 1, 1,‘‘ )  + ‘]‘[ProductDetail]) PRINT @content

此時我們發現多了 &#x0D 恰巧應該是換行導致的,我們將其放在一行資料上即可。

DECLARE @content VARCHAR(MAX)SET @content = (SELECT ‘[‘+ STUFF((SELECT TOP 2 ‘,{"ProductName": "‘ + ProductName + ‘","Price": "‘ + CONVERT(VARCHAR, Price) + ‘","Quantity": "‘ + CONVERT(VARCHAR, quantity) + ‘","Inserton": "‘ + CONVERT(VARCHAR, Inserton, 105) + ‘"}‘ FROM ProductList  FOR XML PATH(‘‘)), 1, 1,‘‘ )  + ‘]‘[ProductDetail]) PRINT @content

此時則能正常輸出:

總結

.NET Core 1.1中尚未有將天數轉換成日期的APi,期待2.0能有更多的APi供我們使用。

.NET Core 1.1日期解析無APi、SQL Server資料轉換JSON

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.