英文:
Django : Query for date range when date is stored as string
问题
由于某些原因,我需要将日期存储为字符串“2023-03-03”,并且我需要使用日期范围来过滤这些数据。
给定起始日期(比如“2023-03-01”)和结束日期(“2023-03-04”),我需要找到给定日期之间的所有行。
目前,我正在使用以下查询:
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
这个查询会返回结果。
我不太明白它是如何工作的。我想知道我正在使用的方法是否正确,或者是否有更好的方法来查询这些数据。
英文:
For some reasons I'm required to store date as string 2023-03-03
and I have a requirement to filter this data using date range.
Given starting date (say 2023-03-01
) and end date (2023-03-04
) I have to find all the rows between the given dates.
Currently I'm using this query
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
which is giving results.
I'm not able to understand how it is working. I'm looking to see if this approach I'm following is right of if there's better approach to query this data.
答案1
得分: 1
这是 ISO 8601 日期格式的一个优点的结果(您正在正确使用):
当您按字母顺序对日期进行排序时,日期将按正确顺序排列。
Django/PostgreSQL 的 __range
查询也可以进行字母顺序比较,因此这是有效的。
因此,当您必须使用文本字段来存储日期时,只要在 ISO 8601 格式中输入它们,并根据需要进行比较/排序,只要在列上创建一个索引(db_index=True
)。这不会像正常的 PostgreSQL 日期那样高效,并且日期特定的 PostgreSQL 功能需要转换,因此会更慢。
英文:
This is the result of one of the advantages of the ISO 8601 date format (which you are correctly using):
When you sort the dates alphabetically, the dates will be correctly ordered.
The django / postgres __range
query can also compare alphabetically, so this works.
So when you have to use a text field for dates, you can totally put them into it in ISO 8601 format, and compare / order them as you wish, as long as you create an index on the column (db_index=True
). It won’t be as efficient as normal postgres dates, and also date-specific postgres features need converting, so will be slower.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论