前言

在批量導(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中我們給出的出生日期則是正確的日期格式,比如如下:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

但是呢,當(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);

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn) 

此時(shí)我們通過 DateTime.FromOADate 方法能夠解析出日期,下面我們?cè)賮砜纯茨壳?NET Core版本為1.1中的情況:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

此時(shí)你會(huì)發(fā)現(xiàn)如下在.NET Core 1.1中并未有此方法。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

既然在Excel導(dǎo)入時(shí)為天數(shù)我們將日期添加天數(shù)不就行了嗎,在NET Core 1.1中只能通過手動(dòng)去轉(zhuǎn)換了。我們來看下:

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

此時(shí)得到的日期如下:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

我們上述通過.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é)果如下:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

上述演示得到的結(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);

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

想到這里,從正向角度去看待,Excel中我們定義為日期型,而為何會(huì)進(jìn)行轉(zhuǎn)換為天數(shù)了呢,我們看看Excel中格式設(shè)置。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

原來是這樣,默認(rèn)是常規(guī),那么我們是否可以設(shè)置自定義日期格式呢。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

我們自定義格式為日期格式就不用再去讀取時(shí)進(jìn)行轉(zhuǎn)換了,豈不爽哉,我們看看結(jié)果:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn) 

無論是從根本和利用代碼去轉(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è)試表。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

插入測(cè)試數(shù)據(jù):

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

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

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

上述就無需我再多講,F(xiàn)OR XML PATH參數(shù)定義為XML根節(jié)點(diǎn)名稱

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

展開XML,則是如下XML數(shù)據(jù)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

在SQL Server 2016有了對(duì)JSON解析的支持還是挺好,在SQL Server 2012中沒有只能借用STUFF函數(shù)來拼接了。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

此時(shí)我們發(fā)現(xiàn)多了 &#x0D 恰巧應(yīng)該是換行導(dǎo)致的,我們將其放在一行數(shù)據(jù)上即可。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

此時(shí)則能正常輸出:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

總結(jié)

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)


感謝花時(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