簡體   English   中英

過濾日期時間字段 python

[英]Filter datetime field python

Json 接收 python:

{
    "str_ini": "2020-06-05",
    "fnsh_date": "2020-06-20",
}

我使用 str_ini 和 fnsh_date 作為參數來構建我的查詢。

訂單模型.py:

fservice = models.DateTimeField(db_column='FService') # (In DB this field is datetime)
ffinishservice = models.DateTimeField(db_column='FFinishService') # (In DB this field is datetime)

視圖.py:

pedidoparams = request.data
start_date = pedidoparams.get("str_ini")
finish_date = pedidoparams.get("fnsh_date")
order = (
    OrderModel.objects.values("zone__zone")
    .filter(fservice__gte=fecha_inicio)
    .filter(ffinishservice__lte=fecha_final)
    .annotate(order_activate=Count("cctt__id"))
)
print("query: ", str(pedidos.query))

python 打印此查詢:

query:  SELECT `zone`.`Zone` AS `Zone`, COUNT(`order`.`cctt_id`) AS `order_activate` FROM `order` INNER JOIN `zone` ON (`order`.`Zone_Id` = `zone`.`Id`) WHERE (`order`.`fservice` >= 2020-06-05 00:00:00 AND `order`.`ffinishservice` <= 2020-06-20 00:00:00) GROUP BY `zone`.`Zone`

我的問題是:為什么要在查詢中添加小時、分鍾和秒? 如果只接收日期,是否有可能在查詢中是:

... Where (`order`.`fservice` >= 2020-06-05 00:00:00 AND `order`.`ffinishservice` <= 2020-06-20 23:59:59)

數據庫中的字段是日期時間,因此 Django 將日期強制轉換為日期時間; 日期時間的默認時間是午夜。

如果您的輸入是日期,您可以

  • 將一天添加到結束日期,並使用lt而不是lte
  • 將結束日期與 23:59:59 結合起來並繼續使用lte (可能會錯過閏秒,但這可能無關緊要)
from django.utils.dateparse import parse_date
import datetime


start_date = parse_date(pedidoparams["str_ini"])
finish_date = parse_date(pedidoparams["fnsh_date"])
start_datetime = datetime.datetime.combine(start_date, datetime.time())
end_datetime = datetime.datetime.combine(end_date, datetime.time(23, 59, 59))

order = (
    OrderModel.objects.values("zone__zone")
    .filter(fservice__gte=start_datetime)
    .filter(ffinishservice__lte=end_datetime)
    .annotate(order_activate=Count("cctt__id"))
)

您在查詢中添加小時、分鍾和秒,因為您的 Model 由 DateTime 字段組成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM