【问题标题】:Datetime comparison query doesn't return any results日期时间比较查询不返回任何结果
【发布时间】:2021-08-24 08:56:10
【问题描述】:

我正在尝试进行简单的日期时间比较,但查询没有返回任何结果。

查询是

MATCH (n:Event) WHERE n.start_datetime > datetime("2019-06-01T18:40:32.142+0100")  RETURN n.start_datetime

根据this documentation page,这种比较应该有效。我也尝试过显式创建日期时间对象,例如使用datetime({year: 2019, month: 7})

我检查了start_datetime 的格式是否正确,例如检查start_datetime.year 的值是否正确,并且找不到任何错误。 鉴于数据库中的所有记录都是从 2021 年开始的,上述查询应该返回每个事件,但没有返回任何内容。

仅使用年份比较而不是完整的日期时间比较来进行查询:

MATCH (n:Event) WHERE n.start_datetime.year > datetime("2019-06-01T18:40:32.142+0100").year  RETURN n.start_datetime

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    仔细检查 start_datetime 的数据类型。它可以以纪元秒或纪元毫秒为单位。您需要将纪元格式转换为日期时间,以使两者具有相同的数据类型。您的第二个查询(.year)有效的原因是因为 .year 返回一个整数值。

    在下面运行以获取示例:

     MATCH (n:Event) 
     RETURN distinct n.start_datetime LIMIT 5
    

    然后,如果您看到它是 10 位数字,那么它就是以 epochSeconds 为单位的。如果是,则运行以下查询:

     MATCH (n:Event) 
     WHERE n.start_datetime is not null 
     AND datetime({epochSeconds: n.start_datetime}) > datetime("2019-06-01T18:40:32.142+0100") 
     RETURN n.start_datetime 
     LIMIT 25
    

    【讨论】:

    • 感谢您的回答 Jose,不幸的是,当我进行第一次查询时,我没有看到纪元时间,但我得到了通常格式的日期时间列表,例如“2021-08-20T10:05:52”
    • 我已经使用 apoc 程序检查了 start_datetime 数据库中的类型,显示为“LocalDateTime”
    【解决方案2】:

    原来错误是由于时区造成的。 Neo4j 将属性保存为LocalDateTime,显然无法与ZonedDateTime 相比。

    我使用py2neo 进行大多数节点管理,解决方案是为 python 属性提供特定的时区。这是(在我的情况下)使用:

    datetime.datetime.fromtimestamp(kwargs["end"], pytz.UTC)
    

    之后,我就可以进行比较了。

    希望这可以为未来的开发人员节省几个小时。

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 2021-06-12
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多