首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django TruncDate给出null

问Django TruncDate给出null
EN

Stack Overflow用户
提问于 2020-03-23 09:35:58
回答 2查看 1.3K关注 0票数 2

我使用的是Django 2.2

我正在使用Django查询过滤记录,如

代码语言:javascript
复制
from datetime import datetime
from django.db.models.functions import TruncDate

start_date = datetime.strptime('2020-02-01', '%Y-%m-%d').date()
end_date = datetime.strptime('2020-03-31', '%Y-%m-%d').date()

lead_list = LeadList.objects.all()

# Filter query
query = LeadListEntry.objects.filter(
    lead_list__in=lead_list
  )

# Filter by start date
query = query.filter(
    created__gte=start_date
  )

# Filter by end date
query = query.filter(
    created__lte=end_date
  )

# Annotate date
query = query.annotate(
     created_date=TruncDate('created')
   ).order_by(
     'created_date'
   ).values('created_date').annotate(
     **{'total': Count('created')}
   )

生成的SQL查询是

代码语言:javascript
复制
SELECT 
    DATE(CONVERT_TZ(`lead_generation_leadlistentry`.`created`, 'UTC', 'UTC')) AS `created_date`, 
    COUNT(`lead_generation_leadlistentry`.`created`) AS `total`
FROM `lead_generation_leadlistentry` 
WHERE (
    `lead_generation_leadlistentry`.`lead_list_id` IN (
        SELECT 
            U0.`id` FROM `lead_generation_leadlist` U0 
        WHERE 
            U0.`deleted` IS NULL
    )
    AND `lead_generation_leadlistentry`.`created` >= '2020-02-01 00:00:00' 
    AND `lead_generation_leadlistentry`.`created` <= '2020-03-31 00:00:00'
)
GROUP BY DATE(CONVERT_TZ(`lead_generation_leadlistentry`.`created`, 'UTC', 'UTC'))
ORDER BY `created_date` ASC

这在本地服务器和暂存服务器上是不同的。

本地开发服务器

代码语言:javascript
复制
+--------------+-------+
| created_date | total |
| ------------ | ----- |
| 2020-02-25   | 15    |
| 2020-02-27   | 10    |
+--------------+-------+

暂存服务器

代码语言:javascript
复制
+--------------+-------+
| created_date | total |
| ------------ | ----- |
| null         | 15    |
+--------------+-------+

日期列为null

备注:Django具有USE_TZ=True启用的时区

LeadListEntry模型

代码语言:javascript
复制
class LeadListEntry(models.Model):
    lead_list = models.ForeignKey(LeadList, on_delete=models.CASCADE, related_name='lead_list_entry')
    data = models.TextField(help_text='Lead List entry data. (JSON data)', blank=False)

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-25 06:50:11

以下是用户获得相同错误的解决方案

错误不是Django,而是MySQL数据库设置。

date字段返回null,因为CONVERT_TZ不工作。这可能是由于MySQL数据库中没有时区数据造成的。

若要导入时区数据,请执行以下命令

代码语言:javascript
复制
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

导入之后,重新启动mysql服务器。

票数 5
EN

Stack Overflow用户

发布于 2020-03-25 03:59:42

由于机器的DateTime不同,可能会出现从局部到分段的不同结果的问题,我以前在windows上开发时就有过这种情况,但是这个阶段很复杂,结果显示strptime()的日期参数不同,并且一直存在错误。

对于日期过滤,并且作为代码示例,您不必创建日期对象,只要有一个正确的字符串日期格式就足够了

代码语言:javascript
复制
start_date = '2020-02-01'
end_date = '2020-03-31'

那就照常去吧。

我想做这样的事,

代码语言:javascript
复制
# As you only need LeadList id's for foreginkey filtering, this is more optimized
lead_list = LeadList.objects.all().values_list('id')

# Filter query
query = LeadListEntry.objects.filter(
    lead_list__in=lead_list, created__date__gte = start_date, created__date__lte=end_date
  )

并按日期分组

代码语言:javascript
复制
query = query.values('created__date').annotate(count=Count('created__date')).order_by('created__date')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60810946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档