#sql #ruby-on-rails #sql-server
Вопрос:
Для проекта Rails, над которым я сейчас работаю, мне нужно проверить, не превысила ли текущая дата определенный период времени (65% от даты начала — даты окончания). Поэтому я создал этот запрос с активной записью:
Mentoropleiding.joins(:sectoraal_partnerschap, mentor: [{
onderneming_mentoren: :onderneming}]).where(mentoropleidingen: {
status: 3 }).where('CONVERT(int,eind_datum_opvolging) >
(DATEDIFF(day, eind_datum_opvolging, start_datum_opvolging) *
0.65)')
Но если я запускаю этот sql, я получаю сообщение об ошибке:
ActiveRecord::StatementInvalid (TinyTds::Error: Explicit conversion from data type date to int is not allowed.)
Итак, проблема в этой строке:
CONVERT(int,eind_datum_opvolging)
Я пытаюсь преобразовать дату в int, но это запрещено. Кто-нибудь знает, как преобразовать DATEDIFF
результат в целое число?
Спасибо за вашу помощь,
Энтони
Комментарии:
1. Результатом
datediff()
является целое число. Нет необходимости в преобразовании. Тем не менее, этот код не должен генерировать эту ошибку. Я бы предложил предоставить примеры данных, желаемые результаты и примеры кода, который на самом деле не работает.2. спасибо Гордону, я попытался использовать datediff без преобразования, это полный sql-запрос: Mentoropleiding.joins(:sectoraal_partnerschap, наставник: [{ onderneming_mentoren: :onderneming}]). где(mentoropleidingen: { статус: 3 }).где(‘eind_datum_opvolging > (DATEDIFF(день, eind_datum_opvolging, start_datum_opvolging) * 0,65)’) но когда я запускаю это, я также получаю ошибку: ActiveRecord::StatementInvalid (TinyTDS::Ошибка: Столкновение типов операндов: дата несовместима с числовой)
3. Проблема не в
DATEDIFF
том , а в том факте, что вы сравниваете дату с ее результатом (т. Е.eind_datum_opvolging > (DATEDIFF(day, eind_datum_opvolging, start_datum_op volging) * 0.65)
Таким образом, вы пытаетесь определить, больше ли дата, чем число, следовательно, ваша ошибка4. Привет, Гарет, да, я заметил это сейчас, но я попытался преобразовать дату в int следующим образом: ПРЕОБРАЗОВАТЬ(int, eind_datum_opvolging) Но затем я получаю ошибку: ActiveRecord::StatementInvalid (TinyTDS::Ошибка: Явное преобразование типа данных date в int не допускается.)
5. Даже если бы вы могли преобразовать дату в int, я не думаю, что это то, что вам нужно в данном случае. Ваша логика относится к желанию, чтобы текущие дни прошли до даты окончания, но на самом деле вы никогда не ссылаетесь на текущую дату…. Я думаю, ты хочешь чего-то вроде:
DATEDIFF(DAY, eind_datum_opvolging, GETDATE()) > (DATEDIFF(day, eind_datum_opvolging, start_datum_opvolging) * 0.65)