前言
在批量導入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

此時我們發現多了 
 恰巧應該是換行導致的,我們將其放在一行數據上即可。
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供我們使用。
