选择 SQL Server DatetimeOffset 作为 .Net DateTimeOffset.Ticks
Posted
技术标签:
【中文标题】选择 SQL Server DatetimeOffset 作为 .Net DateTimeOffset.Ticks【英文标题】:Select SQL Server DatetimeOffset as .Net DateTimeOffset.Ticks 【发布时间】:2020-02-15 10:54:13 【问题描述】:我发送一个 SQL 查询并接收 FOR JSON。
SqlCommand comm = new SqlCommand(@"select top (1000) Date,[open],high,low,[close] from dbo.[foo"] where date > @backDate and date <= @Date order by date FOR JSON AUTO", conn);
comm.Parameters.AddWithValue("@Date", _definition.dateFrom);
comm.Parameters.AddWithValue("@backDate", lowLimit);
string json = (string)comm.ExecuteScalar();
Debug.WriteLine(json);
/* this causes invalid deserialization */
CudaEngine.OHLC[] stream = JsonConvert.DeserializeObject<CudaEngine.OHLC[]>(json);
所以 json 结果中的DateTimeOffset
如下所示:
["日期":"2019-07-30T00:29:00Z","开盘":1.241829000000000e+004,"高":1.245195000000000e+004,
我的 ohcl 结构必须是这样的,日期只要。
public struct OHLC
public long UTCdate;
public double open;
public double High;
public double Low;
public double Close;
如何直接从 SQL 语句转换日期以接收 .Net 长滴答声或毫秒?如果没有invalidCastException
,我该如何反序列化?
【问题讨论】:
你在找这个吗:***.com/q/7386634 它会损害性能,因为它的百万行我最好直接存储 C# 日期时间作为数据库中的长滴答声? 我觉得很奇怪我不能从 sql server 调用 long,即使它的 java long 我可以在 GPU 中发布进程,而不是让 sql server 计算所有这些东西。 【参考方案1】:尝试以下:
public struct OHLC
private long _UTCdate get; set;
public DateTime UTCdate
get return DateTime.FromBinary(_UTCdate);
set _UTCdate = value.ToBinary();
public double open get; set;
public double High get; set;
public double Low get; set;
public double Close get; set;
【讨论】:
【参考方案2】:这很容易在 SQL 查询中转换。唯一棘手的部分(一如既往)是处理时区。
如果 SQL Server 数据类型为datetimeoffset
,则需要将其转换为 UTC 时间,然后将其转换为 datetime2
,如下所示:
cast( [Date] at time zone 'UTC' as datetime2 )
如果 SQL Server 数据类型是 datetime
或 datetime2
并且已经表示 UTC 时间,则不需要此转换。如果它们是datetime
或datetime2
存储在某个本地时区,则需要转换为具有适当时区的datetimeoffset
,然后如上所述转换为UTC。 EG
cast( [Date] at time zone 'Central Standard Time' at time zone 'UTC' as datetime2 )
所以假设 SQL 列是 datetimeoffset
并且您正在转换为 Unix 纪元时间,查询将如下所示:
var sql = @"
select top (1000)
datediff(second, '19700101', cast( [Date] at time zone 'UTC' as datetime2 ) ) Date,
[open],
high,
low,
[close]
from dbo.[foo"]
where date > @backDate
and date <= @Date
order by date
FOR JSON AUTO";
SqlCommand comm = new SqlCommand(sql, conn);
【讨论】:
以上是关于选择 SQL Server DatetimeOffset 作为 .Net DateTimeOffset.Ticks的主要内容,如果未能解决你的问题,请参考以下文章
安装sql server 2008时,到功能选择时提示验证码错误,属性不匹配!想请教
SQL Server--SQL Server数据库bak文件还原