Python 当我使用created_at_uurange指定一个范围时,该范围会移动一天

Python 当我使用created_at_uurange指定一个范围时,该范围会移动一天,python,django,Python,Django,我目前正在使用过滤器“created_at_urange”来指定月份的第一天和最后一天,但此代码不反映今天注册的数据 this_month = datetime.datetime.today() first_day = datetime.datetime(this_month.year, this_month.month, 1) this_month = this_month.strftime('%Y-%m-%d') first_d

我目前正在使用过滤器“created_at_urange”来指定月份的第一天和最后一天,但此代码不反映今天注册的数据

        this_month = datetime.datetime.today()
        first_day = datetime.datetime(this_month.year, this_month.month, 1)
        this_month = this_month.strftime('%Y-%m-%d')
        first_day = first_day.strftime('%Y-%m-%d')
        time = obj.filter(created_at__range=(first_day, this_month)).aggregate(
            time=Sum('time'))['time']
目前,我使用timedelta(days=1)来添加一天,但是如果我这样做,例如,如果日期是3/31,那么它将是4/1,并且计数将是错误的

this_month = datetime.datetime.today() + timedelta(days=1)
为什么会这样?
如果有人知道如何改进,如果您能让我知道,我将不胜感激。

我假设您在创建的
字段是
日期时间字段
。引述

警告

筛选带有日期的日期时间字段将不包括 最后一天,因为边界被解释为“给定时间的上午0点” 日期”。如果发布日期日期时间字段,则上述表达式 将转换为以下SQL:

SELECT ... WHERE pub_date BETWEEN '2005-01-01 00:00:00' and '2005-03-31 00:00:00';
一般来说,你不能把日期和日期时间混在一起

我想补充一下,为什么即使将datetime转换为字符串,也只需在查询中使用对象:

this_month=datetime.datetime.today()
第一天=datetime.datetime(this_month.year,this_month.month,1)
时间=对象过滤器(
在范围=(第一天,本月)创建
).aggregate(时间=总和('time'))['time']
编辑:事实上,为了让这对你自己来说更容易一点,如果将来没有对象会有日期时间,只要让ORM和数据库做更多的工作,如果需要的话,只需比较日期和年份:

today=datetime.datetime.today()
时间=对象过滤器(
在年创建的年=今天。年,
创建的月份=今天的月份,
).aggregate(时间=总和('time'))['time']

我假设您在
创建的
字段是
日期时间字段
。引述

警告

筛选带有日期的日期时间字段将不包括 最后一天,因为边界被解释为“给定时间的上午0点” 日期”。如果发布日期日期时间字段,则上述表达式 将转换为以下SQL:

SELECT ... WHERE pub_date BETWEEN '2005-01-01 00:00:00' and '2005-03-31 00:00:00';
一般来说,你不能把日期和日期时间混在一起

我想补充一下,为什么即使将datetime转换为字符串,也只需在查询中使用对象:

this_month=datetime.datetime.today()
第一天=datetime.datetime(this_month.year,this_month.month,1)
时间=对象过滤器(
在范围=(第一天,本月)创建
).aggregate(时间=总和('time'))['time']
编辑:事实上,为了让这对你自己来说更容易一点,如果将来没有对象会有日期时间,只要让ORM和数据库做更多的工作,如果需要的话,只需比较日期和年份:

today=datetime.datetime.today()
时间=对象过滤器(
在年创建的年=今天。年,
创建的月份=今天的月份,
).aggregate(时间=总和('time'))['time']

是在日期时间创建的吗?如果是这样的话,时间部分将使其晚于“本月”,因为“本月”没有时间,并且暗示为0:00谢谢您的回答。我该如何处理created_at是datetime?created_at是datetime?如果是这样的话,时间部分将使其晚于“本月”,因为“本月”没有时间,并且暗示为0:00谢谢您的回答。我如何处理创建时间为日期时间的情况?谢谢您的回答。为清楚起见,我尝试了使用
obj.filter(在月日第一天创建)count()
,但它不适用于
created\u at\uu range=(月日第一天)和
created\u at\uu month=3
,结果值为1。如果我手动计数,结果与
created\u at\uu month=3
相同,并且
created\u at\uu range=(本月第一天)
的结果少一个。这是为什么?@space\u pok您是使用日期字符串进行查询,还是像我建议的那样使用datetime对象本身?无论如何,如果您觉得这有点复杂,请检查我的编辑。对于created_at,我们使用created_at=models.datetime字段(默认值为datetime.now)注册datetime。我尝试了您编辑的内容,但结果仍然比正常值少1。@space\u pok我相信这只是因为您从过去/未来的某一年中获得了结果,当时您只编写了
created\u at\u month=3
。谢谢您的回答。为清楚起见,我尝试了使用
obj.filter(在月日第一天创建)count()
,但它不适用于
created\u at\uu range=(月日第一天)和
created\u at\uu month=3
,结果值为1。如果我手动计数,结果与
created\u at\uu month=3
相同,并且
created\u at\uu range=(本月第一天)
的结果少一个。这是为什么?@space\u pok您是使用日期字符串进行查询,还是像我建议的那样使用datetime对象本身?无论如何,如果您觉得这有点复杂,请检查我的编辑。对于created_at,我们使用created_at=models.datetime字段(默认值为datetime.now)注册datetime。我尝试了您编辑的内容,但结果仍然比正常值少1。@space\u pok我相信这仅仅是因为您从过去/未来的某一年中获得了结果,而您只在\u月=3时编写了
创建的。