DateOnly 和 TimeOnly 映射到 SQL Server

问题描述 投票:0回答:3

在处理日期时,我一直在 SQL Server 中使用 DateTime2 类型来存储 C# DateTime

.NET 6 引入了新的结构,例如 DateOnlyTimeOnly。我认为这些应该映射到 DateTime

是否存在转换无效的特殊情况?这些类型完全兼容吗?

c# sql-server datetime .net-6.0 c#-10.0
3个回答
2
投票

在 SQL Server 中保存时间时,例如 time(7),通过 SqlDataReader 检索列数据,该值将作为 TimeSpan 返回。

这不是等价转换。但是,要转换为 TimeOnly 实例,您可以解析字符串化的 TimeSpan。

TimeOnly.Parse({timespanvalue}.ToString());

不是非常优雅,但在处理 TimeOnly 和 sql server 时间时需要考虑一些事情。


1
投票

要将时间跨度转换为 TimeOnly,您可以简单地使用 Microsoft 在 TimeOnly 结构上使用静态方法预见的 api :

public static TimeOnly FromTimeSpan (TimeSpan timeSpan);

参考https://learn.microsoft.com/en-us/dotnet/api/system.timeonly.fromtimespan?view=net-8.0

正如您从链接中看到的,这可能仅在 .NET8 中可用

您需要这个的原因是,如果您使用我的 Microsoft 提供的 sqldatareader,它会返回 DateOnly 字段,将 sql server 中的日期映射到 DataTime,而 TimeOnly 字段映射到 sql server 中的时间,但由读取器作为 TimeSpan 返回。要实际获取 dateonly 和 timeonly 字段,您必须使用 DateOnly 和 TimeOnly 上预见的适当 api。


0
投票

你应该做两件事:

  1. 在项目中创建一个文件夹“Converter”和一个“DateOnlyConverter.cs”类,其中包含以下代码

    公共类 DateOnlyConverter : ValueConverter { 公共 DateOnlyConverter() : 基(d => d.ToDateTime(TimeOnly.MinValue), d => DateOnly.FromDateTime(d)) { } }

  2. 在您的 DbContext 类中粘贴以下代码

    受保护的覆盖无效ConfigureConventions(ModelConfigurationBuilder构建器) {
    构建器.Properties() .HaveConversion() .HaveColumnType("日期");

    }

它对我有用!

© www.soinside.com 2019 - 2024. All rights reserved.