密码(neo4j):仅当列内容可解析时,才将列与日期进行比较

zfciruhq  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(179)

我想将一个列与一个日期进行比较,以防它是可解析和可比较的,例如:

  1. MATCH (n)
  2. WHERE n.last_used = "no_information" OR datetime(n.last_used) < datetime(datetime())
  3. RETURN n.name, n.last_used

假设last_used列内容可以是“no_information”字符串或有效的日期/时间字符串。
我仍然得到一个错误:
无法将文本解析为日期时间“no_information”
如果字符串不是有效的日期时间,是否可以跳过解析和比较?

rpppsulh

rpppsulh1#

假设理想情况是日期已经是日期时间格式,以便检查数据类型(例如通过Apoc过程apoc.meta.isType),
一个非常简单的检查字符串的方法可以是使用正则表达式,例如(在这种情况下,我检查“yyyy-mm-dd”,在情况下,它可能更复杂)

  1. MATCH (n)
  2. WHERE n.last_used =~ "\d{4}-\d{1,2}-\d{1,2}.*" and datetime(n.last_used) < datetime(datetime())
  3. RETURN n.name, n.last_used
  4. UNION
  5. MATCH (n)
  6. WHERE n.last_used = "no_information"
  7. RETURN n.name, n.last_used

注意:我使用了UNION子句,因为下面的子句也应该可以工作,但是由于某种原因,它给予了我一个错误。

  1. MATCH (n)
  2. WHERE n.last_used = "no_information"
  3. OR (n.last_used =~ "\d{4}-\d{1,2}-\d{1,2}.*" AND datetime(n.last_used) < datetime(datetime()) ) RETURN n.name, n.last_used

或者,您可以编写一个custom procedure,它调用datetime(..)函数,在出现异常的情况下,捕获该函数并返回null

展开查看全部
u3r8eeie

u3r8eeie2#

如果您的日期时间格式如下所示:2022年6月1日12时50分35.556+0100秒
然后可以使用以下查询:

  1. MATCH (n) where (n.last_used =~ "[0-9\\-T\\.\\+\\:]+"
  2. and datetime( n.last_used ) < datetime(datetime()) )
  3. OR n.last_used = "no_information"
  4. RETURN n

正则表达式表示只过滤包含0到9之间的数字、连字符、字母T、点、加号或冒号的last_used。
样本结果:

  1. ╒══════════════════════════════════════════════════════════════╕
  2. "n"
  3. ╞══════════════════════════════════════════════════════════════╡
  4. │{"name":"testing","last_used":"no_information"}
  5. ├──────────────────────────────────────────────────────────────┤
  6. │{"name":"testing3","last_used":"2022-06-01T12:50:35.556+0100"}│
  7. └──────────────────────────────────────────────────────────────┘
展开查看全部

相关问题