.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供我们使用。

时间: 2024-10-03 19:04:04

.NET Core 1.1日期解析无APi、SQL Server数据转换JSON的相关文章

三种数据库日期转字符串对照sql server、oracle、mysql(V4.11)

三种数据库日期转换对照: http://blog.csdn.net/zljjava/article/details/17552741 SQL类型转换函数:cast(type1 as type2) 数据库中的日期类型 SQL SERVER DATE 1970-01-01 DATETIME 1970-01-01 00:00:00 Oracle DATE 2015-08-07 17:34:37 TIMESTAMP 1970-01-01 00:00:00.000000 是DATE的扩展类型,多了小数秒

sql server 2016 json 解析方法

前几天发现了sql server 2016支持了json 项目需要所以安装了 用了一下 方便了很多  ,写一下小笔记方便日后查看,也希望各位大神指正共同学习. sql server 2016 安装图解网上很多,大家注意安装版本就可以了. --1 带 Root Keyselect * from sys_menu for JSON AUTO ,ROOT('Result') --2  asselect ID, Name, Age as [Entity.Age], Sex as [Entity.Sex]

access日期与sql server日期区别

如选取一段时间内的数据,time1和time2是时间起始字符串,则 sql server命令: string strSQL=" 日期 >='"+time1+"' AND 日期 <= '"+time2+"'"; access命令: string strSQL=" 日期 >=#"+time1+"# AND 日期 <= #"+time2+"#"; 主要区别在于sql s

解答关于.NET Core操作SQL Server的一些小问题

我以前没有关注过这个问题,是因为我在项目中通常使用的bean,无论是service层的,还是dao层的,都是没有状态的bean,里面只有方法,没有成员变量.在使用这样的bean的时候,多个线程访问同一个bean不会产生线程安全问题. 数据库运维中盛传一个小段子,我误删除了数据库,改怎么办?有备份还原备份,没有备份就准备简历!听起来有趣但发生在谁身上,谁都笑不起来. 后面每搭建一个新的服务都需要在keystone中执行四种操作:1.建租户 2.建用户 3.建角色 4.做关联后面所有的服务公用一个租

SQL Server中一些有用的日期sql语句

1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 3.一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 4.季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 5.当天的半夜 SELECT DATEAD

Java 8的日期和时间API

本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,业界广泛使用的是一个第三方的类库Joda-Time,关于Joda-time,我们在33节进行了介绍.Java 1.8学习了Joda-time,引入了一套新的API,位于包java.time下,本节,我们就来简要介绍这套新的API. 我们先从日期和时间的表示开始

第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderson 翻译:谢炀(kiler) 校对:何镇汐.

计算机程序的思维逻辑 (95) - Java 8的日期和时间API

?本节继续探讨Java 8的新特性,主要是介绍Java 8对日期和时间API的增强,关于日期和时间,我们在之前已经介绍过两节了,32节介绍了Java 1.8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,业界广泛使用的是一个第三方的类库Joda-Time,关于Joda-time,我们在33节进行了介绍.Java 1.8学习了Joda-time,引入了一套新的API,位于包java.time下,本节,我们就来简要介绍这套新的API. 我们先从日期和时间的表示开

java 8中新的日期和时间API

java 8中新的日期和时间API 使用LocalDate和LocalTime LocalDate的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息.另外,它也不附带任何与时区相关的信息 LocalDate实例提供了多种方法来读取常用的值,比如年份,月份,星期几等 LocalDate date = LocalDate.of(2014,3,18); int year = date.getYear(); Month month = date.getMonth(); int day =