2016-05-18 4 views
1

У меня есть база данных фондового рынка, в которой цена товара хранится каждые 5 минут. Таблица имеющих ниже столбцовВыберите конкретный временной интервал в каждый день

  • ID
  • товар
  • Время

Так, фондовая биржа закрывается от

  • пятницу 22.00 по Гринвичу в воскресенье 22.00 GMT

Итак, мне нужно исключить эти результаты из моего запроса select.

Есть ли способ, чтобы исключить данные для каждого

пятницу 22.00 по Гринвичу в воскресенье 22.00 GMT

в запросе.

Поскольку размер базы данных очень большой, поэтому я избегаю использовать курсор или петли. Я использую LINQ в приложении и пытаюсь найти какой-то хитрый SQL-взлом и сделаю запрос Select для него.

ответ

1

Там нет трюк необходимо в зависимости от типа базы данных и данных столбца «Время» (если это на самом деле datatime, не раз только)

Вы можете использовать команду SQl datepart выбрать конкретные будний день и час частей, так что вы могли бы включают в себя, что в ИНЕКЕ

Почему не LINQ решение - создание точки зрения может быть полезным для производительности базы данных в случае

  • правильно рассчитался проиндексированы

  • , если база данных может улучшить вид плана выполнения автоматически

  • если вы используете материализованные представления (крайний импульс, если использовать его сразу с ценой некоторого пространства)

1

Если вы используете LINQ в C# и при условии, что ваш Time имеет DateTimestruct типа и в (или UTC) часовой пояс GMT, то в пунктах сбора DataTable, можно фильтровать с помощью Where условие для данного ограничения:

var query = stocks 
    .Where(x => x.Time.DayOfWeek != DayOfWeek.Saturday //not Saturday 
    || !(x.Time.DayOfWeek != DayOfWeek.Friday && x.Time.Hour >= 22) //not Friday after 10PM 
    || !(x.Time.DayOfWeek != DayOfWeek.Sunday && x.Time.Hour <= 22)); //not Sunday before 10PM 
+0

Привет Ян, я попытался x.Time.DayOfWeek, но это не работает, мы необходимо использовать SQLFunctions для того же , LINQ выдает ошибку в x.Time.DayOfWeek, так как это не преобразуется в sql function datepart. –

+0

Каков тип данных в базе данных для 'Time'? это дата? – Ian

+0

Да, это datetime ... –

0

Время имеет тип DateTime (2).Вы могли бы иметь такие критерии, как:

SELECT * 
FROM [MyTable] 
WHERE ((DATEPART(dw, [Time]) + @@DATEFIRST + 6) % 7 <> 6 
      AND ((DATEPART(dw, [Time]) + @@DATEFIRST + 6) % 7 <> 5 
       OR DATEPART(HOUR, [Time]) < 22 
      ) 
      AND ((DATEPART(dw, [Time]) + @@DATEFIRST + 6) % 7 <> 0 
       OR CAST([Time] AS TIME) >= '22:00' 
      ) 
     ); 

С Linq To SQL (Linq To EF имеют специальную DbFunc для DateTime):

var ts = TimeSpan.FromHours(22); 
var data = db.MyTable 
    .Where(t => t.Time.DayOfWeek != DayOfWeek.Saturday && 
    (t.Time.DayOfWeek != DayOfWeek.Friday || t.Time.TimeOfDay < ts) && 
    (t.Time.DayOfWeek != DayOfWeek.Sunday || t.Time.TimeOfDay >= ts)); 

Это позволило бы создать аналогичный (но не такой же) SQL.

+0

Привет, Cetin, я пробовал t.Time.DayOfWeek, но это ошибка, заявив, что «DayOfWeek» не поддерживается в LINQ to Entity .... пожалуйста, помогите –

+0

Но я уже говорил, что это не сработает с Linq To EF (вам необходимо обходным путем использовать Datetime DbFunctions, если вы хотите его использовать). Код, который я дал, работает с Linq to SQL. А также с EF вы можете напрямую использовать SQL с .ExecuteQuery («select ...»). –

0

Вот LINQ к решению Entities на основе this post и Linq query DateTime.Date.DayOfWeek нить:

var query = from stock in db.Stocks 
      let firstSunday = new DateTime(1753, 1, 7) 
      let dayOfWeek = (DayOfWeek)(DbFunctions.DiffDays(firstSunday, stock.Time).Value % 7) 
      let hour = stock.Time.Hour 
      where !((dayOfWeek == DayOfWeek.Friday && hour >= 22) || 
        (dayOfWeek == DayOfWeek.Saturday) || 
        (dayOfWeek == DayOfWeek.Sunday && hour < 22)) 
      select stock; 
Смежные вопросы