前言
在批量導(dǎo)入Excel中的數(shù)據(jù)時(shí)發(fā)現(xiàn)出生日期為整數(shù)也就是為天數(shù),結(jié)果倒騰了翻,這是其一,其二是數(shù)據(jù)庫中的某一列存的是JSON數(shù)據(jù),但是場(chǎng)景是為了作為作業(yè)來運(yùn)行,此時(shí)不得不將篩選出的數(shù)據(jù)手動(dòng)拼接成JSON,給需要的童鞋鋪一點(diǎn)路。
日期問題
在Excel中我們給出的出生日期則是正確的日期格式,比如如下:
但是呢,當(dāng)我們導(dǎo)入數(shù)據(jù)時(shí)發(fā)現(xiàn)將其日期轉(zhuǎn)換成了天數(shù),這其實(shí)也沒什么問題,但是項(xiàng)目是在.NET Core中,則出現(xiàn)了一點(diǎn)問題,在.NET Framework中,如果我們獲取到的出生日期是double型數(shù)字即天數(shù)時(shí),我們?cè)撊绾螌⑵滢D(zhuǎn)換為對(duì)應(yīng)的日期呢,請(qǐng)看如下:
var birthDate = DateTime.FromOADate(33243);
此時(shí)我們通過 DateTime.FromOADate 方法能夠解析出日期,下面我們?cè)賮砜纯茨壳?NET Core版本為1.1中的情況:
此時(shí)你會(huì)發(fā)現(xiàn)如下在.NET Core 1.1中并未有此方法。
既然在Excel導(dǎo)入時(shí)為天數(shù)我們將日期添加天數(shù)不就行了嗎,在NET Core 1.1中只能通過手動(dòng)去轉(zhuǎn)換了。我們來看下:
var birthDate = DateTime.Now.AddDays(-33243);
此時(shí)得到的日期如下:
我們上述通過.NET Framework中的得到的日期為 1991-01-05 而此時(shí)得到的卻為 1992-03-06 ,轉(zhuǎn)換失敗。上述我們是通過當(dāng)前日期去減去天數(shù)導(dǎo)致轉(zhuǎn)換失敗,此時(shí)我們改變思路,從某個(gè)日期加上這個(gè)日期是不是就可以了呢。日期最小從 1899-12-31 開始,所以我們接下來進(jìn)行下操作:
var birthDate = new DateTime(1899, 12, 31).AddDays(33509);
此時(shí)得到的結(jié)果如下:
上述演示得到的結(jié)果為 1991-09-29 ,而我們?cè)贓xcel中的日期為 1991-09-28 后經(jīng)過查閱資料發(fā)現(xiàn),這個(gè)是Excel中的一個(gè)Bug,此時(shí)我們還需要進(jìn)行如下操作才行。
var days = 33509; if(days>59) days-=1; var birthDate = new DateTime(1899, 12, 31).AddDays(days);
在Excel中的日期多加了一天,類似如下:
想到這里,從正向角度去看待,Excel中我們定義為日期型,而為何會(huì)進(jìn)行轉(zhuǎn)換為天數(shù)了呢,我們看看Excel中格式設(shè)置。
原來是這樣,默認(rèn)是常規(guī),那么我們是否可以設(shè)置自定義日期格式呢。
我們自定義格式為日期格式就不用再去讀取時(shí)進(jìn)行轉(zhuǎn)換了,豈不爽哉,我們看看結(jié)果:
無論是從根本和利用代碼去轉(zhuǎn)換皆可解決問題,上述我們從Excel問題出發(fā)估計(jì)還保險(xiǎn)一點(diǎn)。
SQL Server數(shù)據(jù)轉(zhuǎn)換為JSON
利用代碼轉(zhuǎn)換為JSON簡直是SO EASY。但是上述也已經(jīng)表明了場(chǎng)景,直接通過存儲(chǔ)過程篩選數(shù)據(jù)并將數(shù)據(jù)存儲(chǔ)為JSON字符串來進(jìn)行短信通知,下面我們來看看,創(chuàng)建測(cè)試表。
CREATE TABLE ProductList (Id INT IDENTITY(1,1) PRIMARY KEY, ProductName VARCHAR(500), Price NUMERIC(18,2), Quantity INT, Inserton DATETIME )
插入測(cè)試數(shù)據(jù):
INSERT INTO ProductList ( ProductName, Price, quantity, Inserton ) VALUES ('Digital camera',20000,5,getdate()),('Laptop',10000,5,getdate())
接下來我們要將其先轉(zhuǎn)換為XML,通過FOR XML PATH,如下:
SELECT * FROM ProductList FOR XML PATH('Jeffcky')
上述就無需我再多講,F(xiàn)OR XML PATH參數(shù)定義為XML根節(jié)點(diǎn)名稱
展開XML,則是如下XML數(shù)據(jù)
在SQL Server 2016有了對(duì)JSON解析的支持還是挺好,在SQL Server 2012中沒有只能借用STUFF函數(shù)來拼接了。
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
此時(shí)我們發(fā)現(xiàn)多了 
 恰巧應(yīng)該是換行導(dǎo)致的,我們將其放在一行數(shù)據(jù)上即可。
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
此時(shí)則能正常輸出:
總結(jié)
.NET Core 1.1中尚未有將天數(shù)轉(zhuǎn)換成日期的APi,期待2.0能有更多的APi供我們使用。
感謝花時(shí)間閱讀此篇文章,如果您覺得這篇文章你學(xué)到了東西也是為了犒勞下博主的碼字不易不妨一下吧,讓樓主能喝上一杯咖啡,在此謝過了! 如果您覺得閱讀本文對(duì)您有幫助,請(qǐng)點(diǎn)一下“”按鈕,您的將是我最大的寫作動(dòng)力! 本文版權(quán)歸作者和博客園共有,來源網(wǎng)址:歡迎各位轉(zhuǎn)載,但是未經(jīng)作者本人同意,轉(zhuǎn)載文章之后,否則保留追究法律責(zé)任的權(quán)利。
http://www.cnblogs.com/CreateMyself/p/6534568.html