查询的日期范围 (Frappe)

问题描述

我想为 frappe 查询创建一个过滤器,用于查找日期介于 2 个其他日期之间的值。具体来说,工资单 start_date 和 end_date 应该包括出勤日期。

doc_name = ##Some Salary Slip
document = frappe.get_doc('Salary Slip',doc_name)

leave_count = frappe.db.count('Attendance',filter={
    'employee': document.get('employee'),'status': 'Present','late_entry': 1,'attendance_date': ['>=',document.get('start_date')],'attendance_date': ['<=',document.get('end_date')]})

在这行不通,因为字典中有重复的条目。因此,根据 12,我应该能够使用列表作为过滤器,但可以这样尝试

leave_count = frappe.db.count('Attendance',filters=[
             ['employee','=',document.get('employee')],['status','Present'],['late_entry',1],['attendance_date','>=','<=',document.get('end_date')]])

但它抛出一个错误

TypeError: 只能将 str(不是“list”)连接到 str

快速浏览一下代码说明,当前只支持字典,for 循环需要键而不是列表,并且 between 不是选项,因为该运算符会自动转换为 '=' 并且不会不行。

那我该怎么做?

编辑:目前最简单的方法是使用 frappe.db.get_list 并在 python 中统计结果。虽然这效率低下,但确实有效。

解决方法

您可能希望使用 frappe.db.sql 方法运行原始 SQL 查询。

result = frappe.db.sql("""
SELECT COUNT(*) FROM `tabAttendance`
WHERE
    employee=%(employee)s
    AND status= 'Present'
    AND late_entry= 1,attendance_date between %(start_date)s AND %(end_date)s
""",{
    'employee': document.get('employee')
    'start_date' : document.get('start_date')
    'end_date' : document.get('end_date')})
leave_count = result[0][0]