我知道在 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 注入,这只是为了测试而编写的。问题是我需要 Query Set 因为Pagination。现在我尝试了这个解决方案,它只有在我指定年份部分时才有效:
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 格式存储。
编辑:好的,我发现原因是MySql 中缺少 TIMEZONE 表。但是,如何在不转换为 TIMEZONE 的情况下进行过滤?