如何在实体框架中将datetimeoffset转换为datetime?

时间:2016-12-14 05:51:27

标签: entity-framework-6 datetimeoffset

这似乎很简单,但EF并不支持DateTimeOffset.DateTimeDateTimeOffset.LocalDateTimeDateTime.Date等属性。我试图仅通过DateTime组件过滤DateTimeOffset类型字段(即' local' DateTime),这在普通的sql中是一件简单的事情:where cast(x as datetime) = '2016-12-14'

有一个DbFunctions.TruncateTime,但没有相应的TruncateOffset

似乎没有任何方法可以将DateTimeOffset对象转换或转换为在linq-to-entities中工作的普通DateTime对象。唯一的转化是从DateTimeDateTimeOffset的隐式转化,但不是相反。

2 个答案:

答案 0 :(得分:0)

pipe我遇到了完全相同的问题,并且能够使用DbFunctions.TruncateTime解决问题

以下是一个例子:

DbFunctions.DiffDays

使用DbFunctions.DiffDays时,不考虑偏移量。以下是MSDN文档:https://msdn.microsoft.com/en-us/library/dn220092(v=vs.113).aspx

答案 1 :(得分:0)

您可以使用 DbFunctions.CreateDateTime 去除偏移量,例如:

...
.Select(e => new MyClass {                                      
  MyDate = DbFunctions.CreateDateTime(e.MyDateTimeOffset.Year,
                                      e.MyDateTimeOffset.Month,
                                      e.MyDateTimeOffset.Day,
                                      e.MyDateTimeOffset.Hour,
                                      e.MyDateTimeOffset.Minute,
                                      e.MyDateTimeOffset.Second)
...

正如您可能怀疑的那样,这会创建一些非常糟糕的SQL,即:

convert (datetime2,right('000' + convert(varchar(255), DATEPART (year, [Extent1].[MyDateTimeOffset])), 4) + '-' + convert(varchar(255), DATEPART (month, [Extent1].[MyDateTimeOffset])) + '-' + convert(varchar(255), DATEPART (day, [Extent1].[MyDateTimeOffset])) + ' ' + convert(varchar(255), DATEPART (hour, [Extent1].[MyDateTimeOffset])) + ':' + convert(varchar(255), DATEPART (minute, [Extent1].[MyDateTimeOffset])) + ':' + str( CAST( DATEPART (second, [Extent1].[MyDateTimeOffset]) AS float), 10, 7), 121) AS [C2]

然而它会给你你想要的东西。

有一点需要注意的是,这将完全剥离/忽略偏移量(如OP请求的那样)。