.NET Core 1.1日期解析无APi、SQL Server数据转换JSON

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前言 在批量导入Excel中的数据时发现出生日期为整数也就是为天数,结果倒腾了翻,这是其一,其二是数据库中的某一列存的是JSON数据,但是场景是为了作为作业来运行,此时不得不将筛选出的数据手动拼接成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供我们使用。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
20天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:<https://github.com/khellang/Scrutor>
39 5
|
3月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
295 3
|
3月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
45 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
28天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
27 3
|
5天前
|
开发框架 算法 中间件
ASP.NET Core 中的速率限制中间件
在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
24 0
|
3月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
111 9
|
3月前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
3月前
|
SQL 开发框架 .NET
sql server日期时间函数
sql server日期时间函数
54 2
|
4月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。