2013-05-22 3 views
0

Мне нужно написать запрос django raw для фильтрации года и месяца. для этого я пробовал следующий код.Django необработанный фильтр запросов по годам и месяцам

cursor = connection.cursor() 
cursor.execute('SELECT SUM(work_time) AS sum FROM structure_tracking_details WHERE employee_id = %s AND tree_id=%s AND project_structure=%s AND year(date)=%s AND month(date)=%s GROUP BY project_structure ', [employee_id,tree_id,project_structure,select_year,select_month]) 
sum1=str(cursor.fetchone()) 

но он сообщает no such function: year что не так с моим кодом?

+1

год - название вашей колонки? –

+0

no column name is date – Lahiruzz

+1

В какой базе данных у вас есть как ваш сервер? –

ответ

3

SQLite doesn't have a YEAR() function. Если вы хотите год, вы можете использовать что-то вроде этого -

select strftime('%Y', datetime(datefield, 'unixepoch')) as year from table_name 

Таким образом, вместо того, чтобы писать year(date)=%s, вы могли бы написать strftime('%Y', date) = %s. Он должен работать. Я не пробовал.

Оставьте все эти головные боли и используйте ORM от Django. Вы должны использовать это в первую очередь.

Edit:
Согласно OP, этот запрос работал -

cursor.execute("SELECT SUM(work_time) AS sum FROM structure_tracking_details WHERE employee_id = %s AND tree_id=%s AND project_structure=%s AND strftime('%%Y', date) = %s AND strftime('%%m', date) = %s GROUP BY project_structure ", employee_id, tree_id, project_structure, select_year, select_month]) 

%Y нужно экранировать с помощью %%Y.

+0

Мне нужно отфильтровать год из таблицы? есть ли какая-либо функция? – Lahiruzz

+0

обновленный ответ, check, –

+0

Теперь я получил: символ поддержки без поддержки «Y» (0x59) в индексе 140. Не знаю, почему :( – Lahiruzz

2

Почему вы не используете ORM?

Если у вас есть модель, как это:

class Work(models.Model): 
    date_field = models.DateField() 
    # your other fields 

Вы можете сделать этот запрос, используя year и month Lookups:

Work.objects.filter(date_field__year=2013,date_field__month=2) 

Теперь, чтобы добавить остальную часть Вашего материала, который суммирование work_time и группа:

from django.models import Sum 

Work.objects.filter(date_field__year=2013, 
        date_field__month=2, 
        employee_id=1, 
        ...).values('project_structure').aggregate(total=Sum('work_time')) 
+1

OP может просто запросить таблицу, которую они не смоделировали. –

+0

@Burhan: Есть ли функция для Group by? – Lahiruzz

+0

['values'] (https://docs.djangoproject.com/en/dev/topics/db/aggregation/#values) @Lahiruzz –

Смежные вопросы