Извлечение данных за день из SQL Server - PullRequest
1 голос
/ 12 мая 2019

Мне нужно получить все значения из базы данных SQL Server по дням (24 часа). У меня есть столбец меток времени в таблице TestAllData, и я хочу выбрать данные, которые соответствуют только определенному дню.

Например, есть метки времени типа DateTime, такие как '2019-03-19 12:26:03.002', '2019-03-19 17:31:09.024' и '2019-04-10 14:45:12.015', поэтому я хочу загрузить данные для дня 2019-03-19 и отдельно для дня 2019-04-10. По сути, необходимо получить значения DateTime с той же датой.

Можно ли использовать для этого некоторые функции, например DatePart или DateDiff?

А как мне вообще решить такую ​​проблему?

Как и в этом случае, я не знаю точной разницы в часах между отметкой времени и концом дня (поскольку существуют разные отметки времени на 1 день), и мне нужно извлечь сам день из отметки времени. После этого мне нужно сгруппировать данные по дням или что-то вроде этого и получить блок за блоком. Например:

'2019-03-19' - 1200 записей '2019-04-10' - 3500 записей '2019-05-12' - 10000 записей и т. Д.

Я ищу более общее решение, не предоставляющее временную метку (например, '2019-03-19') в качестве границы или в предложении where, потому что проблема не в простой фильтрации данных по какой-либо дате !!

ОБНОВЛЕНИЕ: В моем наборе данных у меня около 1 000 000 записей и более 100 уникальных дат. Я думал о том, чтобы извлечь набор уникальных дат и затем выполнить запрос в цикле, где данные будут отфильтрованы по указанному дню. Это выглядело бы так:

select * from TestAllData where dayColumn = '2019-03-19'
select * from TestAllData where dayColumn = '2019-04-10'
select * from TestAllData where dayColumn = '2019-05-12'
...

Я мог бы использовать этот запрос в своем коде, поэтому я могу запустить его в цикле из функции Scala. Однако я не уверен, что с точки зрения производительности было бы хорошо выполнить отдельный запрос на извлечение уникальных дат.

1 Ответ

1 голос
/ 12 мая 2019

В зависимости от того, хотите ли вы иметь возможность работать со всеми датами (а не только с подмножеством), один из самых простых способов добиться этого - использовать приведение:

;with cte as (SELECT cast(my_datetime as date) as my_date, * from TestAllData)
SELECT * FROM cte where my_date = '2019-02-14'

Обратите внимание, что при приведении даты к дате времена усекаются, то есть извлекается только часть даты.

Как я уже сказал, насколько это эффективно, зависит от ваших потребностей, так как все значения даты и времени из всех записей будут приведены к дате до того, как данные будут отфильтрованы. Однако если вы хотите выбрать несколько дат (в отличие от одной или двух), это может оказаться быстрее в целом, поскольку один раз считывает всю таблицу, а затем дает столбец, по которому вы можете фильтровать гораздо эффективнее.

Однако, если это постоянное требование, я бы, вероятно, использовал постоянный вычисляемый столбец, что фактически означало бы, что приведение выполняется сначала, а затем только снова, если изменилось соответствующее значение. Для большой таблицы я также настоятельно рекомендовал бы индекс для вычисляемого столбца.

...