Odoo域校验当前时间是否在两个日期字段间报错求助
问题分析与解决方案
这个报错的核心原因很明确:你的domain里把date_from和date_to当成了字符串字面量,而不是模型的字段引用。Odoo生成SQL时,会把'date_from'直接作为字符串值去和today字段做时间比较,自然会抛出"invalid input syntax for type timestamp"的错误——毕竟'date_from'根本不是合法的时间格式。
下面分两种常见场景给出解决办法:
场景1:过滤当前系统时间处于date_from和date_to之间的记录(最常用)
如果你真实需求是筛选出「现在正处于假期时间段内」的记录,那完全不需要自定义today字段,直接用Odoo内置的current_datetime()函数获取当前系统时间即可:
XML配置写法
<field name="domain">[('date_from', '<=', current_datetime()), ('date_to', '>=', current_datetime())]</field>
这里的current_datetime()会动态返回服务器当前的日期时间,生成的SQL会正确比较字段值和当前时间,不会出现语法错误。
场景2:比较记录自身的today字段与date_from/date_to字段
如果你确实需要用记录里的today字段(比如记录创建时的时间)去和另外两个字段做比较,需要明确告诉Odoo:右边的是字段引用,不是字面量字符串。在XML的domain里,要把字段名放在元组中:
XML配置写法
<field name="domain">[('today', '>=', ('date_from',)), ('today', '<=', ('date_to',))]</field>
这样Odoo会识别('date_from',)是字段引用,生成的SQL会变成hr_holidays.today >= hr_holidays.date_from这种字段间的比较,而不是拿字符串去转时间戳。
补充:Python代码中的domain写法
如果是在Python代码里定义domain,写法会更简洁(Odoo会自动识别字符串形式的字段名):
# 场景1的Python写法 domain = [('date_from', '<=', fields.Datetime.now()), ('date_to', '>=', fields.Datetime.now())] # 场景2的Python写法 domain = [('today', '>=', 'date_from'), ('today', '<=', 'date_to')]
内容的提问来源于stack exchange,提问作者Prashanth K
相关产品推荐
相关产品推荐

