Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 запрос по дате в условии where  [new]
запрос по дате в условии 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]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27695
Хотелось бы уточнить: выбранный интервал - это где, кем и как производится выбор?
Что является результатом выполнения программы, то есть что происходит с возвращаемыми данными?
9 июл 17, 00:27    [20626487]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос100
Guest
skyANA,
Добрый день !
Ответ.
Хотелось бы уточнить: выбранный интервал - это где, кем и как производится выбор?
Данные выбирают пользователи за нужный им период в интерфейсе программы.

Что является результатом выполнения программы, то есть что происходит с возвращаемыми данными?
Результатом является набор данных за период. Возвращенные данные имеют несколько групп и обрабатываются дальше в Excel.
Собственно ничего особенного с ними не происходит.

Цель данного вопроса - автоматизация рутины. То есть предоставить пользователю возможность выгрузить данные сразу за несколько периодов, не запуская выборку 10 раз.
Если вас интересует почему из выборки 1раз за 10 дней нельзя в excel получить такую же как и 10 раз запустив программу, то
потому что параметр дата передается сразу в несколько групп данных, в числе которых и остатки. А остатки никак нельзя посмотреть не выполнив запрос за малый период. Поэтому надо запускать несколько раз. А это рутина.
9 июл 17, 10:54    [20626731]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос 101
Guest
Remind,

Большое спасибо !!!
Наверно это то что мне нужно.
9 июл 17, 10:55    [20626733]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос 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]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
aleks2
Guest
Запрос 102
О блин. Дела !
В целом работает. Но разбивает на сутки от даты запуска.

А как бы мне сделать, что бы оно сутки прибавляло к минимальной дате, а расчетный период был сутки но с 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'


Хосподи, откуда эти тупые "программизды" берутся?

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]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос 103
Guest
Можно попробавать Time2 всегда сводить к 9.00 отбрасывая все лишнее. Тогда и Time1 будет 9.00
То есть запустил до 9 не получишь ничего кроме вчерашнего числа.
Запустил в 12 получишь только до 9 сегодняшего.

Кто знает как отбросить все что больше 9.00 в сегодняшнем числе ?
9 июл 17, 12:50    [20626884]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос 102
Guest
aleks2,

Не так не считается. Клиент могет любое время выбрать. Так я тоже могу )
9 июл 17, 12:52    [20626888]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос 103
Guest
Или может просто зашить время статическое 9 часов и сделать работу переменной только на дату.
9 июл 17, 12:55    [20626896]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
aleks2
Guest
Запрос 102
aleks2,

Не так не считается. Клиент могет любое время выбрать. Так я тоже могу )

Вот и я говорю: абсолютная тупость и лень.

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]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос 105
Guest
aleks2
Запрос 102
aleks2,

Не так не считается. Клиент могет любое время выбрать. Так я тоже могу )

Вот и я говорю: абсолютная тупость и лень.

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;

aleks2 похоже разбирается, только в общении малоприятный формучанин. Вопрос можно закрывать
9 июл 17, 13:56    [20626996]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27695
Запрос100
skyANA,
Добрый день !
Ответ.
Хотелось бы уточнить: выбранный интервал - это где, кем и как производится выбор?
Данные выбирают пользователи за нужный им период в интерфейсе программы.

Что является результатом выполнения программы, то есть что происходит с возвращаемыми данными?
Результатом является набор данных за период. Возвращенные данные имеют несколько групп и обрабатываются дальше в Excel.
Собственно ничего особенного с ними не происходит.

Цель данного вопроса - автоматизация рутины. То есть предоставить пользователю возможность выгрузить данные сразу за несколько периодов, не запуская выборку 10 раз.
Если вас интересует почему из выборки 1раз за 10 дней нельзя в excel получить такую же как и 10 раз запустив программу, то
потому что параметр дата передается сразу в несколько групп данных, в числе которых и остатки. А остатки никак нельзя посмотреть не выполнив запрос за малый период. Поэтому надо запускать несколько раз. А это рутина.

То есть Вы хотите вместо одного excel файла выгрузить 10, изменив запрос так, чтобы он несколько record set-ов возвращал?
Но для такого решения потребуется и запрос изменить и клиентский код.

Я бы посоветовал ограничиться изменениями только в клиентском коде.
9 июл 17, 14:06    [20627011]     Ответить | Цитировать Сообщить модератору
 Re: запрос по дате в условии where  [new]
Запрос 106
Guest
skyANA,
То есть Вы хотите вместо одного excel файла выгрузить 10, изменив запрос так, чтобы он несколько record set-ов возвращал?

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

И да сейчас есть небольшой вопрос что показывать в гриде нужно одно ( результат выполнения с параметрами общих дат ), а выгражать другое... уже по дням. ( как вариант по дням )

Но для такого решения потребуется и запрос изменить и клиентский код.
Я бы посоветовал ограничиться изменениями только в клиентском коде.
Надо попробовать. Интересно что получится.
Может какие то скрытые датаgrids сделаю и будет запрос по периодам в них идти и выгружать. Может еще как то.

Просто стало одно время интересно как делать такие вещи...
9 июл 17, 14:39    [20627046]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить