Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Select语句中将DateTime强制转换为Unix时间戳?_C#_Sql Server_Entity Framework_Datetime_Timestamp - Fatal编程技术网

C# 在Select语句中将DateTime强制转换为Unix时间戳?

C# 在Select语句中将DateTime强制转换为Unix时间戳?,c#,sql-server,entity-framework,datetime,timestamp,C#,Sql Server,Entity Framework,Datetime,Timestamp,我确实有一个数据库表,其中包含数百万个存档值行,其中包括一个值(单个)、两个整数id字段和一个日期时间字段(以及一些与我要构建的缓存无关的其他字段)。桌子的结构是固定的,我不能改变它。现在,我想将所有行读取到一个简单类的对象数组中,我想将该类保存在内存中以用于缓存 为了降低内存消耗,我想使用unix时间戳而不是datetime对象。这也很有用,因为将连续使用此缓存的前端图表等也会在本机上使用Unix时间戳 对于缓存创建,我希望直接选择到ArchiveElement中。这对大多数字段都很有效,但我

我确实有一个数据库表,其中包含数百万个存档值行,其中包括一个值(单个)、两个整数id字段和一个日期时间字段(以及一些与我要构建的缓存无关的其他字段)。桌子的结构是固定的,我不能改变它。现在,我想将所有行读取到一个简单类的对象数组中,我想将该类保存在内存中以用于缓存

为了降低内存消耗,我想使用unix时间戳而不是datetime对象。这也很有用,因为将连续使用此缓存的前端图表等也会在本机上使用Unix时间戳

对于缓存创建,我希望直接选择到ArchiveElement中。这对大多数字段都很有效,但我不知道如何在select语句中动态创建Unix时间戳:

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())