【问题标题】:How to use a comparison operator (like a BETWEEN clause) on dates in JSON using PostgreSQL?如何使用 PostgreSQL 在 JSON 中的日期上使用比较运算符(如 BETWEEN 子句)?
【发布时间】:2016-01-13 04:04:47
【问题描述】:

我有一个名为 myfield 的 json 列,其中包含一个 json 文档:

{"createDate": 1448067864151, "id": 1, "name": "hello"}

我可以像这样提取 createDate:

SELECT 
myfield->'createDate' AS dt
FROM mytable

我可以使用 JavaScript 正确查看日期

console.log(new Date(1447734116009));
> 2015-11-17T04:21:56.009Z

我该如何完成这样的事情:

SELECT
*
FROM mytable
WHERE myfield->'createDate' BETWEEN '2015-11-1' AND '2015-11-10'

我还想在提取的日期字段上使用大于和小于运算符。

SELECT
*
FROM mytable
WHERE myfield->'createDate' > '2015-11-1'

我不确定如何使用 PostgreSQL 查询语言中的 JSON 扩展来构建它。

基于this help doc,,似乎 Postgres 甚至没有 JSON 的日期运算符。如果没有,是否有其他方法(例如使用自定义函数)将序列化日期转换为其他格式(可能是 ISO 格式?),然后在其上使用常规 PostgreSQL 日期运算符?

【问题讨论】:

    标签: javascript json postgresql


    【解决方案1】:

    您的 createDate 键显然包含 Unix 纪元格式的值:自 1970-01-01 00:00:00+00 以来的秒数。 PostgreSQL 和 Java 都使用相同的格式(尽管 Java 在 int64 中使用毫秒精度,而 PostgreSQL 在 float64 中使用秒),因此您可以轻松地将 json 值转换为 PostgreSQL timestamp with time zone,然后应用默认值日期\时间运算符:

    SELECT *
    FROM mytable
    WHERE to_timestamp(myfield->'createDate' * 0.001) BETWEEN '2015-11-1' AND '2015-11-10';
    

    更一般地说,PostgreSQL 没有专门针对 json 值的 any 运算符。您总是必须解压您的 json 文档,然后直接使用这些值,如果隐式解释没有用,可能在将它们转换为特定类型之后(例如,如果值全是 [0-9],则解释为 @987654329 @),就像这里的情况一样。据我所知,Java(可能还有其他所有语言/框架)也是如此。

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2018-03-19
      • 2016-10-07
      • 1970-01-01
      • 2023-04-08
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多