V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhuyw2006
V2EX  ›  Django

请教 django 查询问题

  •  
  •   zhuyw2006 · 2018-10-10 19:38:32 +08:00 · 2872 次点击
    这是一个创建于 1996 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个字段是<年月日时分秒>,FSTTIME = models.CharField(max_length=14, blank=True, null=True)
    例:20181010112339

    我需要根据开始时间(时分秒),和结束时间(时分秒)。去查询这个字段;
    而且可能会跨越凌晨,比如:从下午 16 点 到 凌晨 5 点 ( 160000 ~ 050000 );
    不知道这样能不能查询呢?谢谢
    13 条回复    2018-10-11 11:05:31 +08:00
    Leigg
        1
    Leigg  
       2018-10-10 19:53:11 +08:00 via iPhone
    怎么查的到呢?
    应该存时间戳,查的时候条件随便给,都可以转换成时间戳在库里面查。
    zhuyw2006
        2
    zhuyw2006  
    OP
       2018-10-10 20:00:19 +08:00
    @Leigg 你好,是把时间信息单独放在 TimeField 字段吗?
    lonelinsky
        3
    lonelinsky  
       2018-10-10 20:06:55 +08:00
    用 DateTimeField,然后啥问题都解决了,时间切片都可以 https://docs.djangoproject.com/en/2.1/ref/models/fields/#datetimefield
    fatelovely
        4
    fatelovely  
       2018-10-10 20:08:35 +08:00
    用字符串类型存储时间信息,这不是把一个简单的问题生生复杂化了吗?

    如果是固定的查询要求,比如「下午 16 点到凌晨 5 点」,可以通过构造正则表达式,还是可以查的。

    如果是动态的查询要求,就算了吧。重新开一个时间戳字段,使用当前的字符串字段初始化一下,是正道。
    zhuyw2006
        5
    zhuyw2006  
    OP
       2018-10-10 20:17:13 +08:00
    @lonelinsky
    @fatelovely
    我只需要时分秒,使用 TimeField 字段就可以了吧?
    查询下午 16 点 到 凌晨 5 点的时候是不是 FSTTIME__gte=160000 FSTTIME__lte=050000 ?
    Leigg
        6
    Leigg  
       2018-10-10 20:59:47 +08:00 via iPhone
    不是,就像存一个 int 类型把时间戳存进去就可以了。integerfield
    Leigg
        7
    Leigg  
       2018-10-10 21:01:03 +08:00 via iPhone
    timefield 我想也是能够解决问题的,只是我用的最多的还是时间戳,什么数据库都可以存。
    zhuyw2006
        8
    zhuyw2006  
    OP
       2018-10-10 22:24:47 +08:00
    @fatelovely 你好,我现在单独使用字符串字段放时间,当天到凌晨的应该如何查询呢?
    我现在这样 Q(FSTTIME__range=(checkPeriodSTime, “ 235959 ”)) &
    Q(FSTTIME__range=("000000", checkPeriodETime))
    查询不到。
    NaVient
        9
    NaVient  
       2018-10-11 08:40:43 +08:00
    @zhuyw2006 写个脚本就把里边的数据转了,继续用字符串存时间以后你的坑会越来越多的
    PythonAnswer
        10
    PythonAnswer  
       2018-10-11 09:02:25 +08:00 via iPhone
    时间戳。自己换算 hms。这样跨日方便。
    不跨日可以用 datetime 记得可以单独提取年月日时分秒。
    zhuyw2006
        11
    zhuyw2006  
    OP
       2018-10-11 09:58:22 +08:00
    @NaVient 我现在已经独立出来了。不过还是不知道怎么查询跨越凌晨的问题,比如:从下午 16 点 到 凌晨 5 点 ( 160000 ~ 050000 );

    @PythonAnswer 应该如何查询呢?谢谢
    lonelinsky
        12
    lonelinsky  
       2018-10-11 10:10:41 +08:00
    @zhuyw2006
    如果是用 TimeField 的话用 ` Q(FSTTIME__gte=160000) | Q(FSTTIME__lte=050000) ` 应该是可以的呀
    zhuyw2006
        13
    zhuyw2006  
    OP
       2018-10-11 11:05:31 +08:00
    @lonelinsky 谢谢,安装您的方法改成 DateTimeField 字段就可以了,不过查询的时候要加 FSTTIME__time__gte,
    因为我只需时间。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5891 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:11 · PVG 10:11 · LAX 19:11 · JFK 22:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.