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


前言

在批量導入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供我們使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM