选择 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 数据类型是 datetimedatetime2 并且已经表示 UTC 时间,则不需要此转换。如果它们是datetimedatetime2 存储在某个本地时区,则需要转换为具有适当时区的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 server2012

SQL Server--SQL Server数据库bak文件还原

Sql server2012转sql server2008步骤经验总结(转)

如何安装sql server 2005

如何在 SQL Server 视图中选择值(如果存在)或其他值(如果不在 SQL Server 视图中)