SQL 13 месяцев транзакции и количество извлечения данных с разбивкой по месяцам

Я читал пару старых постов и пытался применить ту же логику к моему вопросу, мне нужно извлечь данные за 13 месяцев с разбивкой по месяцам, я также хотел бы применить данные к соответствующим заголовкам... любые предложения. Пожалуйста, смотрите код ниже и ошибка получена.

SELECT ST.TXDATE, ST.CODE, ST.QUANTITY    
FROM StocTran ST
WHERE ST.TXDATE >= DATEADD(MONTH, -13, CAST(GETDATE() AS DATE))
ORDER BY ST.TXDATE

ОШИБКА: [Elevate Software][DBISAM] Ошибка DBISAM Engine # 11949 Ошибка синтаксического анализа SQL - ожидаемый конец оператора, но он найден (в операторе SELECT SQL в строке 3, столбец 27, код ошибки: 11949

1 ответ

Решение

DATEADD - это функция в TransactSQL MS для Sql Server. Я не знаю, что DBIsam поддерживает его, и он не указан в списке поддерживаемых функций DBIsam здесь:

https://www.elevatesoft.com/manual?action=viewtopic&id=dbisam4&product=delphi&version=7&topic=functions

Как правило, функции даты не переносимы между различными механизмами SQL, и из этого списка одной из возможностей может быть использование EXTRACT функция вместо:

Функция EXTRACT возвращает конкретное значение из значения даты, времени или метки времени. Синтаксис выглядит следующим образом:

EXTRACT(extract_value
        FROM column_reference or expression)
EXTRACT(extract_value,
        column_reference or expression)

Используйте EXTRACT для возврата года, месяца, недели, дня недели, дня, часов, минут, секунд или миллисекунд из столбца даты, времени или метки времени. EXTRACT возвращает значение для указанного элемента в виде целого числа.

Параметр extract_value может содержать любой из спецификаторов: YEAR MONTH WEEK DAYOFWEEK DAYOFYEAR DAY HOUR MINUTE SECOND MSECOND

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

ОБНОВЛЕНИЕ: от поиска в Google dbisam dateadd похоже, у Elevate нет хорошего ответа на эквивалент DATEADD, Одним из хитов является эта тема:

https://www.sqlservercentral.com/Forums/Topic173627-169-1.aspx

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

Другие вопросы по тегам