WedX - журнал о программировании и компьютерных науках

извлечь (неделя из «Сейчас») ошибка

Я запускаю суперклассический Firebird 2.5 на своем raspberrypi. Я выполняю следующий запрос, и он дает следующую ошибку:

SELECT foodmanager1.F_US_FIRSTNAME,foodmanager1.F_US_LASTNAME, 
foodmanager1.F_US_PICTURE_URL,
foodmanager2.F_US_FIRSTNAME, foodmanager2.F_US_LASTNAME, 
foodmanager2.F_US_PICTURE_URL,
duty.F_US_FIRSTNAME, duty.F_US_LASTNAME,
duty.F_US_PICTURE_URL,
a.F_FD_DATE from
    T_FOOD_DUTY a
inner join T_USER foodmanager1 on a.F_US_ID1 = foodmanager1.F_US_ID
inner join T_USER foodmanager2 on a.F_US_ID2 = foodmanager2.F_US_ID
inner join T_USER duty on a.F_US_ID3 = duty.F_US_ID
where extract(week from a.F_FD_DATE) = extract(week from 'Now')

С этой ошибкой:

Указанная часть EXTRACT не существует во входном типе данных.

Код ошибки SQL=~105.

Я знаю, что проблема связана с extract(week from 'Now'), потому что, когда я вручную заменяю его числом, я получаю некоторые результаты.

Любая идея, в чем проблема, или у вас есть альтернатива?

26.05.2017

Ответы:


1

Проблема в том, что extract принимает любой тип данных, но работает только для типов date, time или timestamp. В этом контексте 'Now' — это просто char(3), поэтому извлекать нельзя (он не может извлекать данные из типа char).

Путаница возникает из-за того, что в некоторых контекстах (например, присваивание или явное приведение к date, time или timestamp) 'Now' даст текущую дату/время. В данном контексте это не работает, потому что Firebird не может знать, какой из трех типов должен быть; теоретически extract принимает любой тип, то, что он может делать на самом деле, определяется типом, который он получает.

Вам нужно явно принудить его к date (или timestamp):

  1. Использование явного приведения:

    extract(week from cast('Now' as date))
    
  2. Использование вводного типа (также известного как сокращенное приведение):

    extract(week from date'Now')
    
  3. Или, как предлагается в ответе ain, используйте стандартную "функцию" SQL current_date или current_timestamp:

    extract(week from current_date)
    
26.05.2017
  • Вариант 2 - это задокументировано? самое похожее, что я видел, это указание кодировки/сопоставления для констант строкового литерала. А вот такое указание типажей - кажется, первый раз вижу в ФБ 26.05.2017
  • @Arioch'Да, это так: Сокращенные приведения типов данных даты и времени, это также указано в стандарте SQL (хотя там оно определено для формата 'yyyy-MM-dd hh:mm:ss.SSSSSSS', а не для таких вещей, как 'now'). 26.05.2017

  • 2

    Используйте стандарт SQL CURRENT_TIMESTAMP (или CURRENT_DATE, так как часть времени не важна при извлечении недели) вместо 'NOW'

    extract(week from CURRENT_TIMESTAMP)
    

    Или, если вы действительно хотите использовать 'NOW', приведите его к дате:

    extract(week from CAST('Now' AS DATE))
    
    26.05.2017
  • Я «позаимствовал» ваше предложение использовать current_timestamp, надеюсь, вы не против :) 26.05.2017
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]