mysql - Django 按年、月、日、时、分过滤日期时间

标签 mysql django datetime timezone django-1.6

我是aware of problems在 Django 中过滤日期时间。这就是我构建原始查询集的原因:

query = 'SELECT * FROM meteorological_data_base.meteorological_data'

if year is not None:
    query += ' WHERE EXTRACT(YEAR FROM date_time) = ' + year
    if month is not None:
        query += ' AND EXTRACT(MONTH FROM date_time) = ' + month
        if day is not None:
            query += ' AND EXTRACT(DAY FROM date_time) = ' + day
            if hour is not None:
                query += ' AND EXTRACT(HOUR FROM date_time) = ' + hour
meteorological_data_list = MeteorologicalData.objects.raw(query)

我知道 SQL 注入(inject),这只是为了测试而编写的。问题是我需要查询集因为 Pagination .现在我尝试了 this solution并且仅当我仅指定年份部分时它才有效:

MeteorologicalData.objects.filter(date_time__year=2010)

如果我也传递了月份,那么它返回空查询集:

MeteorologicalData.objects.filter(date_time__year=2010, date_time__month=1)

当我使用 Django 调试工具栏时,我可以看到 Django 生成了什么样的 SQL 查询。对于最后一个例子(年份和月份),它生成了这个:

SELECT COUNT(*) FROM `meteorological_data` WHERE (EXTRACT(MONTH FROM CONVERT_TZ(`meteorological_data`.`date_time`, 'UTC', 'Europe/Ljubljana')) = 1 AND `meteorological_data`.`date_time` BETWEEN '2009-12-31 23:00:00' and '2010-12-31 22:59:59')

我在 mysql 控制台中尝试了这个,它确实返回了 0 行。如果我删除 CONVERT_TZ 命令:

SELECT COUNT(*) FROM `meteorological_data` WHERE (EXTRACT(MONTH FROM `meteorological_data`.`date_time`) = 1 AND `meteorological_data`.`date_time` BETWEEN '2009-12-31 23:00:00' and '2010-12-31 22:59:59')

它正常工作。现在我正在使用时区感知日期时间。我在设置中的配置:

TIME_ZONE = 'Europe/Ljubljana'
USE_TZ = True

所以最后的问题是。如何使用不会转换为时区感知日期时间的过滤器命令。数据已以 UTC 格式存储。

编辑: 好的,我发现原因是missing TIMEZONE table in MySql .但是,如何在不转换为 TIMEZONE 的情况下进行过滤?

最佳答案

如果关闭 USE_TZ 会发生什么环境?此外,(假设您清理 SQL 以使用参数化查询)您可以使用 .raw() 取回 RawQuerySet方法。

编辑:经过审查,如果问题是您查询的数据是 UTC 而您使用的日期时间不是,为什么不在运行查询之前将日期时间转换为 UTC?

关于mysql - Django 按年、月、日、时、分过滤日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756264/

相关文章:

java - 如何使用准备好的语句和批处理将大型csv导入到mysql中

mysql - MySQL 中的 Kannel DLR 报告

python - 从 django-admin 中选择另一个外键来过滤外键字段?

python - 重用 auth 用户更改的密码

django - 使用 Django REST Framework 作为 Django 的身份验证后端

c# - 为什么我不能接受这个任务?

mysql - 5分钟吧使用mysql

mysql - mySql 中多表更新语句以及 Order By 和 LIMIT

php - 通过php和vba向mysql插入汉字

python - 使用 python 检查日期时间是否有日期名称或时区