Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
запрос по дате в условии where
Guest |
Добрый день ! Кто подскажет как в программе сделать такую логику. Есть программа для работы с базой данных. Она использует sql запрос в котором в условии where производится отбор по датам. И все бы ничего, но хотелось бы что бы выбранный интервал ( разница между датами ) разбивался на какой то фиксированный интервал, например сутки и программа выполнялась ровно столько раз сколько получилось таких внутренних интервалов. Например при запуске такого примера - 10 раз каждый раз за сутки. Сейчас она выполняется один раз за 10 суток. dim @TIME1 as datatime dim @TIME2 as datatime SET @TIME1 = '2017-05-01 00:00:000' SET @TIME2 = '2017-05-10 00:00:000' SELECT * FROM TABLE WHERE DATEFIELD BETWEEN @Time1 AND @TIME2 Буду благодарен за ответы. |
8 июл 17, 23:56 [20626465] Ответить | Цитировать Сообщить модератору |
skyANA Member Откуда: Зеленоград Сообщений: 28355 |
Хотелось бы уточнить: выбранный интервал - это где, кем и как производится выбор? Что является результатом выполнения программы, то есть что происходит с возвращаемыми данными? |
9 июл 17, 00:27 [20626487] Ответить | Цитировать Сообщить модератору |
Remind Member Откуда: UK Сообщений: 523 |
запрос по дате в условии where,declare @TIME1 as datatime declare @TIME2 as datatime SET @TIME1 = '2017-05-01 00:00:000' SET @TIME2 = '2017-05-10 00:00:000' WHILE @TIME1 < @TIME2 BEGIN SELECT * FROM TABLE WHERE DATEFIELD BETWEEN @TIME1 AND DATEADD(DAY, 1, @TIME1) SET @TIME1 = DATEADD(DAY, 1, @TIME1) END |
9 июл 17, 02:53 [20626557] Ответить | Цитировать Сообщить модератору |
Запрос100
Guest |
skyANA, Добрый день ! Ответ. Хотелось бы уточнить: выбранный интервал - это где, кем и как производится выбор? Данные выбирают пользователи за нужный им период в интерфейсе программы. Что является результатом выполнения программы, то есть что происходит с возвращаемыми данными? Результатом является набор данных за период. Возвращенные данные имеют несколько групп и обрабатываются дальше в Excel. Собственно ничего особенного с ними не происходит. Цель данного вопроса - автоматизация рутины. То есть предоставить пользователю возможность выгрузить данные сразу за несколько периодов, не запуская выборку 10 раз. Если вас интересует почему из выборки 1раз за 10 дней нельзя в excel получить такую же как и 10 раз запустив программу, то потому что параметр дата передается сразу в несколько групп данных, в числе которых и остатки. А остатки никак нельзя посмотреть не выполнив запрос за малый период. Поэтому надо запускать несколько раз. А это рутина. |
9 июл 17, 10:54 [20626731] Ответить | Цитировать Сообщить модератору |
Запрос 101
Guest |
Remind, Большое спасибо !!! Наверно это то что мне нужно. |
9 июл 17, 10:55 [20626733] Ответить | Цитировать Сообщить модератору |
Запрос 102
Guest |
О блин. Дела ! В целом работает. Но разбивает на сутки от даты запуска. А как бы мне сделать, что бы оно сутки прибавляло к минимальной дате, а расчетный период был сутки но с 9.00 до 9.00, а на то что не вошло в сутки с 9 до 9 следующего числа, делать отдельные группы. То есть взяли за SET @TIME1 = '2017-05-08 07:00:000' SET @TIME2 = '2017-05-09 11:00:000' То есть за данный интервал получить 3 блока с '2017-05-08 07:00:000' до '2017-05-08 09:00:000' с '2017-05-08 09:00:000' до '2017-05-09 09:00:000' с '2017-05-09 09:00:000' до '2017-05-09 11:00:000' |
9 июл 17, 12:00 [20626813] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Хосподи, откуда эти тупые "программизды" берутся? declare @TIME1 as datatime declare @TIME2 as datatime SET @TIME1 = '2017-05-01 09:00:000' SET @TIME2 = '2017-05-10 09:00:000' WHILE @TIME1 < @TIME2 BEGIN SELECT * FROM TABLE WHERE DATEFIELD BETWEEN @TIME1 AND DATEADD(DAY, 1, @TIME1) SET @TIME1 = DATEADD(DAY, 1, @TIME1) END |
||
9 июл 17, 12:50 [20626883] Ответить | Цитировать Сообщить модератору |
Запрос 103
Guest |
Можно попробавать Time2 всегда сводить к 9.00 отбрасывая все лишнее. Тогда и Time1 будет 9.00 То есть запустил до 9 не получишь ничего кроме вчерашнего числа. Запустил в 12 получишь только до 9 сегодняшего. Кто знает как отбросить все что больше 9.00 в сегодняшнем числе ? |
9 июл 17, 12:50 [20626884] Ответить | Цитировать Сообщить модератору |
Запрос 102
Guest |
aleks2, Не так не считается. Клиент могет любое время выбрать. Так я тоже могу ) |
9 июл 17, 12:52 [20626888] Ответить | Цитировать Сообщить модератору |
Запрос 103
Guest |
Или может просто зашить время статическое 9 часов и сделать работу переменной только на дату. |
9 июл 17, 12:55 [20626896] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Вот и я говорю: абсолютная тупость и лень. declare @TIME1 as datatime declare @TIME2 as datatime SET @TIME1 = '2017-05-01 04:51:000' SET @TIME2 = '2017-05-10 10:00:000' if cast(@TIME1 as time) < '09:00' begin SELECT * FROM TABLE WHERE DATEFIELD BETWEEN @TIME1 AND cast('09:00' as datetime ) + datediff(day, 0, @TIME1 ) set @TIME1 = cast( '09:00' as datetime ) + datediff( day, 0, @TIME1 ); end; WHILE DATEADD(DAY, 1, @TIME1) <= @TIME2 BEGIN SELECT * FROM TABLE WHERE DATEFIELD BETWEEN @TIME1 AND DATEADD(DAY, 1, @TIME1) SET @TIME1 = DATEADD(DAY, 1, @TIME1) END; if cast(@TIME2 as time) > '09:00' begin SELECT * FROM TABLE WHERE DATEFIELD BETWEEN cast('09:00' as datetime ) + datediff(day, 0, @TIME2) AND @TIME2 end; |
||
9 июл 17, 13:08 [20626911] Ответить | Цитировать Сообщить модератору |
Запрос 105
Guest |
|
||||
9 июл 17, 13:56 [20626996] Ответить | Цитировать Сообщить модератору |
skyANA Member Откуда: Зеленоград Сообщений: 28355 |
То есть Вы хотите вместо одного excel файла выгрузить 10, изменив запрос так, чтобы он несколько record set-ов возвращал? Но для такого решения потребуется и запрос изменить и клиентский код. Я бы посоветовал ограничиться изменениями только в клиентском коде. |
||
9 июл 17, 14:06 [20627011] Ответить | Цитировать Сообщить модератору |
Запрос 106
Guest |
skyANA, То есть Вы хотите вместо одного excel файла выгрузить 10, изменив запрос так, чтобы он несколько record set-ов возвращал? Да, но только в части выгрузки в excel, но не отображения. Сколько будет экселей не очень важно, их будет столько сколько периодов, важно что они будут появляться в цикле, дальше vba будет хватать то что есть, приводить в другой формат и все это будет в другой уже книге. Текущая книга каждый раз будет закрываться. И тд. И да сейчас есть небольшой вопрос что показывать в гриде нужно одно ( результат выполнения с параметрами общих дат ), а выгражать другое... уже по дням. ( как вариант по дням ) Но для такого решения потребуется и запрос изменить и клиентский код. Я бы посоветовал ограничиться изменениями только в клиентском коде. Надо попробовать. Интересно что получится. Может какие то скрытые датаgrids сделаю и будет запрос по периодам в них идти и выгружать. Может еще как то. Просто стало одно время интересно как делать такие вещи... |
9 июл 17, 14:39 [20627046] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |