Как выбирать записи из регистра сведений на текущую дату
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Просто в условие ГДЕ
Укажите Напрмер в
ГДЕ
Задать через параметр:
1.Дата= &Дата
Воспользоватья втроенным методом ДАТАВРЕМЯ.
2.Дата = ДатаВремя(2022,08,19)
если нужно период определенный отобрать также в ГДЕ:
Через параметры:
1.ДАТА Между &НачалоПериода и &КонецПериода
:через встроенный метод:
2.ДАТА Между ДатаВремя(2022,08,01) и ДатаВремя(2022,08,19)
Укажите Напрмер в
ГДЕ
Задать через параметр:
1.Дата= &Дата
Воспользоватья втроенным методом ДАТАВРЕМЯ.
2.Дата = ДатаВремя(2022,08,19)
если нужно период определенный отобрать также в ГДЕ:
Через параметры:
1.ДАТА Между &НачалоПериода и &КонецПериода
:через встроенный метод:
2.ДАТА Между ДатаВремя(2022,08,01) и ДатаВремя(2022,08,19)
(5)
А если надо на текущую дату, то в условиях ставлю ТекущаяДата()?
Просто в условие ГДЕ
Укажите Напрмер в
ГДЕ
Задать через параметр:
1.Дата= &Дата
Воспользоватья втроенным методом ДАТАВРЕМЯ.
2.Дата = ДатаВремя(2022,08,19)
если нужно период определенный отобрать также в ГДЕ:
Через параметры:
1.ДАТА Между &НачалоПериода и &КонецПериода
:через встроенный метод:
2.ДАТА Между
Укажите Напрмер в
ГДЕ
Задать через параметр:
1.Дата= &Дата
Воспользоватья втроенным методом ДАТАВРЕМЯ.
2.Дата = ДатаВремя(2022,08,19)
если нужно период определенный отобрать также в ГДЕ:
Через параметры:
1.ДАТА Между &НачалоПериода и &КонецПериода
:через встроенный метод:
2.ДАТА Между
А если надо на текущую дату, то в условиях ставлю ТекущаяДата()?
Если Вы обратитесь к СрезуПоследних через где
Например: ГДЕ КурсВалют < 40, вы можете получить пустую таблицу т.к. в срезе курс может быть больше 40,
поэтому в таком случае лучше брать не через ГДЕ а через параметры РС, тогда срез будет найден по условиям.
Я бы расписал пример подробнее, но книга у меня в данный момент не под рукой.
Например: ГДЕ КурсВалют < 40, вы можете получить пустую таблицу т.к. в срезе курс может быть больше 40,
поэтому в таком случае лучше брать не через ГДЕ а через параметры РС, тогда срез будет найден по условиям.
Я бы расписал пример подробнее, но книга у меня в данный момент не под рукой.
(9)Нашел:
Вот два варианта обращения к РС через запрос:
В первом случае найдет такой срез в котором валюта евро и курс меньше 40
Во втором случае найдет сначала срез последних, а потом отфильтрует его через ГДЕ - и если в срезе нет валюты меньше 40 - результат будет пустым
Вот два варианта обращения к РС через запрос:
ВЫБРАТЬ
КурсыВалют.Период,
КурсыВалют.Дата,
КурсыВалют.Курс
ИЗ
РС.КурсыВалют.СрезПоследних(,Валюта = &Евро И Курс < 40) КАК КурсыВалют
ВЫБРАТЬ
КурсыВалют.Период,
КурсыВалют.Дата,
КурсыВалют.Курс
ИЗ
РС.КурсыВалют.СрезПоследних(,Валюта = &Евро) КАК КурсыВалют
ГДЕ КурсыВалют.Курс < 40
ПоказатьВ первом случае найдет такой срез в котором валюта евро и курс меньше 40
Во втором случае найдет сначала срез последних, а потом отфильтрует его через ГДЕ - и если в срезе нет валюты меньше 40 - результат будет пустым
(26) Какой задачи? Задача "узнать, когда в последний раз курс евро был < 40"?
А это точно надо в учетной торговой или бухгалтерской системе?
Не, ну если задача стоит именно так, и руководство использует учетную систему вместо аналитической - ради бога, фигачьте ресурсы в параметры виртуальной таблицы.
Вот только регистр "Курсы валют" предназначен несколько для других целей.
А это точно надо в учетной торговой или бухгалтерской системе?
Не, ну если задача стоит именно так, и руководство использует учетную систему вместо аналитической - ради бога, фигачьте ресурсы в параметры виртуальной таблицы.
Вот только регистр "Курсы валют" предназначен несколько для других целей.
(41) ок. Тогда я приведу примеры и аналитику:
Вариант1. Через СрезПоследних:
Аналитика плана выполнения запроса:
Statistics: RecordsScanned = 1373, ParseTime = 0, ExecuteTime = 3, BuffersMemory = 25940, ResultRecords = 1, RecordSize = 47
Вариант2. через физ. таблицу:
Аналитика плана выполнения запроса:
Statistics: RecordsScanned = 1339, ParseTime = 0, ExecuteTime = 15, BuffersMemory = 25940, ResultRecords = 1, RecordSize = 47
Даже на небольшом объеме данных видна разница времени выполнения.
Это еще не учитывая, что записей может потребоваться больше, если нужны данные по всем валютам.
Вариант1. Через СрезПоследних:
ВЫБРАТЬ
КурсыВалютСрезПоследних.Период КАК Период,
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(
,
Валюта = &Валюта
И Курс < 45) КАК КурсыВалютСрезПоследних
ПоказатьАналитика плана выполнения запроса:
Statistics: RecordsScanned = 1373, ParseTime = 0, ExecuteTime = 3, BuffersMemory = 25940, ResultRecords = 1, RecordSize = 47
Вариант2. через физ. таблицу:
ВЫБРАТЬ ПЕРВЫЕ 1
КурсыВалют.Период КАК Период,
КурсыВалют.Валюта КАК Валюта,
КурсыВалют.Курс КАК Курс,
КурсыВалют.Кратность КАК Кратность
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Валюта = &Валюта
И КурсыВалют.Курс < 45
УПОРЯДОЧИТЬ ПО
Период УБЫВ
ПоказатьАналитика плана выполнения запроса:
Statistics: RecordsScanned = 1339, ParseTime = 0, ExecuteTime = 15, BuffersMemory = 25940, ResultRecords = 1, RecordSize = 47
Даже на небольшом объеме данных видна разница времени выполнения.
Это еще не учитывая, что записей может потребоваться больше, если нужны данные по всем валютам.
(50) Почему нет-то? Если надо наложить отбор на РЕАЛЬНЫЙ срез последних по ресурсу - то это надо делать именно через ГДЕ.
Например, если вам надо отобрать определенные текущие статусы документов (Статус - ресурс) - вы же не будете отбор по ресурсу запихивать в параметры виртуальной таблицы? Если вы так сделаете - у вас в результат попадут все документы, которые кода-либо имели такой статус (даже не смотря на то, что сейчас он другой).
Например, если вам надо отобрать определенные текущие статусы документов (Статус - ресурс) - вы же не будете отбор по ресурсу запихивать в параметры виртуальной таблицы? Если вы так сделаете - у вас в результат попадут все документы, которые кода-либо имели такой статус (даже не смотря на то, что сейчас он другой).
(53)
+ я же правильно понимаю: что в случае среза выбирается 1 запись, удовлетворяющая условиям ВТ, а потом на нее накладывается где,
а если применять к РС, то выбираются ВСЕ записи, а потом на них накидывается условие ГДЕ
выбрана то будет одна запись, но не факт что она будет одна и та же
+ я же правильно понимаю: что в случае среза выбирается 1 запись, удовлетворяющая условиям ВТ, а потом на нее накладывается где,
а если применять к РС, то выбираются ВСЕ записи, а потом на них накидывается условие ГДЕ
выбрана то будет одна запись, но не факт что она будет одна и та же
(55)
В данном случае условие сразу накладывается на исходную таблицу, и с этим SQL отлично справляется.
а если применять к РС, то выбираются ВСЕ записи
При обращении к физической таблице - записи не выбираются в какой-то отдельный пул (типа выбрать все, а потом че-то с ними будем делать).
В данном случае условие сразу накладывается на исходную таблицу, и с этим SQL отлично справляется.
(55)
Там все сложнее.
Если в секции ГДЕ есть отбор по индексированным полям и по не индексированным, то происходит отбор индексированным и уже по ним полный перебор для отбора по не индексированным.
PS. И да, тут оптимизатор может вмешаться и посчитать, что выгоднее сделать сразу полный перебор, если таблица небольшая и/или статистика не правильная (это еще один из факторов поддерживать статистику в актуальном состоянии).
а если применять к РС, то выбираются ВСЕ записи, а потом на них накидывается условие ГДЕ
Там все сложнее.
Если в секции ГДЕ есть отбор по индексированным полям и по не индексированным, то происходит отбор индексированным и уже по ним полный перебор для отбора по не индексированным.
PS. И да, тут оптимизатор может вмешаться и посчитать, что выгоднее сделать сразу полный перебор, если таблица небольшая и/или статистика не правильная (это еще один из факторов поддерживать статистику в актуальном состоянии).
(21) перечитал уже десятки книг и пересмотрел кучу уроков, ну не всё я понимаю с первого или даже с пятого раза из них, пока не покажут более простым языком. Во многих сферах разбираюсь хорошо, но конкретно программирование идёт тяжко для меня, поэтому и задаю порой вопросы первого класса, не могу по-другому, желание научиться-то есть
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот