C# 在Select语句中将DateTime强制转换为Unix时间戳?
我确实有一个数据库表,其中包含数百万个存档值行,其中包括一个值(单个)、两个整数id字段和一个日期时间字段(以及一些与我要构建的缓存无关的其他字段)。桌子的结构是固定的,我不能改变它。现在,我想将所有行读取到一个简单类的对象数组中,我想将该类保存在内存中以用于缓存 为了降低内存消耗,我想使用unix时间戳而不是datetime对象。这也很有用,因为将连续使用此缓存的前端图表等也会在本机上使用Unix时间戳 对于缓存创建,我希望直接选择到ArchiveElement中。这对大多数字段都很有效,但我不知道如何在select语句中动态创建Unix时间戳:C# 在Select语句中将DateTime强制转换为Unix时间戳?,c#,sql-server,entity-framework,datetime,timestamp,C#,Sql Server,Entity Framework,Datetime,Timestamp,我确实有一个数据库表,其中包含数百万个存档值行,其中包括一个值(单个)、两个整数id字段和一个日期时间字段(以及一些与我要构建的缓存无关的其他字段)。桌子的结构是固定的,我不能改变它。现在,我想将所有行读取到一个简单类的对象数组中,我想将该类保存在内存中以用于缓存 为了降低内存消耗,我想使用unix时间戳而不是datetime对象。这也很有用,因为将连续使用此缓存的前端图表等也会在本机上使用Unix时间戳 对于缓存创建,我希望直接选择到ArchiveElement中。这对大多数字段都很有效,但我
ArchiveCache = db.ArchiveValues.Select(x => new ArchiveElement() {
DataPointId = (UInt16)x.DataPointId,
StationId = (UInt16)x.StationId,
Value = (Single)x.Value,
DateValue = x.DateValue // <-- Here I want to cast into Unix Timestamp
});
我的应用程序中确实有一个函数,可以将DateTime
转换为Unix时间戳,但它不在select
语句的范围内工作。所以我需要找到另一种方法
一种方法是在.Select(..)
语句之前插入.ToList()
,这样我就可以访问自己的函数,但这是一种很难解决的方法,因为它会从数据库中获取很多不必要的字段
有没有一种方法可以将日期时间转换为“就地”?因此,首先声明Unix纪元时间:
var unixEpoch = DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
现在,在您的选择中
,只需从日期值中减去历元即可得到时间跨度
类型,您可以从中获得所需的总秒数
:
ArchiveCache = db.ArchiveValues.Select(x => new ArchiveElement() {
DataPointId = (UInt16)x.DataPointId,
StationId = (UInt16)x.StationId,
Value = (Single)x.Value,
DateValue = (x.DateValue - unixEpoch).TotalSeconds
});
注意:这假设您的DateValue
属性是双精度的,您可能需要将其转换为long
编辑
为了应对实体框架,这可能会起作用:
ArchiveCache = db.ArchiveValues.Select(x => new ArchiveElement() {
DataPointId = (UInt16)x.DataPointId,
StationId = (UInt16)x.StationId,
Value = (Single)x.Value,
DateValue = SqlFunctions.DateDiff("ss", unixEpoch, x.DateValue)
});
这可能需要对System.Data.Entity.SqlServer
进行引用/导入
DATEDIFF(SECOND,{d '1970-01-01'}, GETUTCDATE())
这将返回sql中的unix秒数。它会获取大量不必要的字段吗?看起来您正试图以任何方式提取整个表DB表还有一些字段,我在这里没有提到,只是为了简单起见。您所说的Unix时间戳到底是什么意思?你是指大纪元时间吗,例如1423748783?我是指1970年1月1日以来的秒数。(全部在UTC中,转换到本地时间发生在前端的后面)。这会抛出System.ArgumentException(DbarthMatticExpression)。啊,我忘了这是实体框架。您可以在
选择之前执行ToList()
?如果这样做,我也可以使用自己的函数;-)
DATEDIFF(SECOND,{d '1970-01-01'}, GETUTCDATE())