Выберите SQL Сервер DatetimeOffset как. Net DateTimeOffset.Ticks - PullRequest
0 голосов
/ 15 февраля 2020

Я отправляю запрос 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);

Итак, результат DateTimeOffset in json выглядит следующим образом:

[ {"Date": "2019-07-30T00: 29: 00Z", "open": 1.241829000000000e + 004, "high": 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?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Это просто конвертировать в запросе SQL. Единственная сложная часть (как всегда) связана с часовыми поясами.

Если тип данных SQL Server равен datetimeoffset, то вам нужно перевести его во время UT C, а затем преобразовать в datetime2, например:

cast( [Date] at time zone 'UTC' as datetime2 )

Если тип данных SQL Server имеет значение datetime или datetime2 и уже представляет время UT C, тогда вам не нужно это преобразование. И если они datetime или datetime2 хранятся в каком-то местном часовом поясе, вам необходимо преобразовать их в datetimeoffset с соответствующим часовым поясом, а затем преобразовать в UT C, как указано выше. EG

cast( [Date] at time zone 'Central Standard Time' at time zone 'UTC' as datetime2 )

Таким образом, предполагая, что столбец SQL равен datetimeoffset, и вы конвертируете в Unix Epoch Time, запрос будет выглядеть так:

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);
0 голосов
/ 15 февраля 2020

Попробуйте следующее:

    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; }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...