08.08.2007, 19:13 | #1 |
Участник
|
Функции встроенного SQL для работы с датой
Как на встроенном SQL реализовать такой запрос:
X++: SELECT CREATEDDATE, dateadd(MM, 2, CREATEDDATE), datediff(dd, dateadd(MM, 2, CREATEDDATE), getdate()) FROM SalesTable |
|
08.08.2007, 19:16 | #2 |
Участник
|
Выбрать CreatedDate, а потом уже с полученным курсором (значением поля этого) делать мутки со сравнением даты и т.д.
|
|
08.08.2007, 19:22 | #3 |
Участник
|
язык, на котором я работаю, не позволяет это сделать с такой легкостью, как SQL. Другие варианты есть?
|
|
08.08.2007, 19:31 | #4 |
Участник
|
Connection, Statement, RecordSet
Правда не понял про "язык, на котором я работаю" |
|
08.08.2007, 19:42 | #5 |
Участник
|
Я общаюсь с Акзаптой через COM интерфейсы. Наш продукт изпользует встроенный SQL для доступа к данным. Такова архитектура, хороша она или нет не мне решать - это стандарт.
|
|
08.08.2007, 22:53 | #6 |
Moderator
|
эммм... не очень понимаю, почему вы отвергаете подход Ивана с курсором... Другого-то все равно ничего нет, если упираться именно во встроенный SQL.
Оператор select на встроенном SQL выбирает по одной записи (он не выбирает набор, как обычный SQL, который можно сразу всем набором куда-то передать дальше). Для прохода по всем записям, удовлетворяющим условиям where или join'ам, после первого select'a используется оператор next до тех пор, пока не кончится набор записей, либо вместо select сразу используется конструкция while select. В любом случае записи выбираются друг за другом в некотором цикле. Поэтому у вас должен быть этот самый "зазор" между записями, в течение которого вы и сможете сосчитать все свои функции от дат (какие-то полезные функции дат вроде есть в классе Global). Я далек от мысли, что у вас написан какой-то свой движок, который в качестве параметра съедает строку на внутреннем SQL и возвращает обратно сразу весь набор, скрывая цикл в себе так, что вы не можете никак вмешаться в его выполнение со своими дополнительными вычислениями. В любом случае никаких вычислений (агрегаты, получаемые при помощи group by, не в счет), а также вызовов функций во встроенном select делать нельзя по определению. Ведь выбираемая из реальной таблицы запись помещается в переменную типа запись той же структуры, что и сама таблица. Поэтому при выполнении оператора select A, B from Table1 значения из полей A и B очередной записи таблицы будут помещены в поля A и B табличной переменной Table1. Аксапта не даст вам выполнить оператор select A, B, A+B from Table1, потому что у табличной переменной Table1 нет ячейки для хранения выражения A+B. |
|
09.08.2007, 00:56 | #7 |
Участник
|
Цитата:
Сообщение от Gustav
В любом случае никаких вычислений (агрегаты, получаемые при помощи group by, не в счет), а также вызовов функций во встроенном select делать нельзя по определению. Ведь выбираемая из реальной таблицы запись помещается в переменную типа запись той же структуры, что и сама таблица. Поэтому при выполнении оператора select A, B from Table1 значения из полей A и B очередной записи таблицы будут помещены в поля A и B табличной переменной Table1. Аксапта не даст вам выполнить оператор select A, B, A+B from Table1, потому что у табличной переменной Table1 нет ячейки для хранения выражения A+B.
|
|