[ES]ElasticSearch中时间日期的时区探讨

问题

        由于ES不能指定时区(也许将来会支持也说不一定),目前是时区始终是UTC。

  • 如果存储是日期时间类型,则需考虑时区问题;
  • 如果是字符串,除非直接比对,否则在转换为日期是会有时区问题;
  • 如果是时间戳,即Long类型,同样需要考虑时区问题。

试验

        执行的查询SQL命令:

POST http://localhost:9200/_sql?format=text

当前时间-默认

        查询语句:

{
  "query": "SELECT CURRENT_TIMESTAMP as ts"
}

        返回结果:

                     ts              
-------------------------------------
2023-11-30T23:31:14.632Z

        返回的结果,实际上与我上海时区的实际相差了8个小时,即默认返回的是UTC时间

当前时间-上海时区

           查询语句:

{
  "query": "SELECT CURRENT_TIMESTAMP as ts",
  "time_zone":"Asia/Shanghai"
}

        返回结果:

                          ts              
--------------------------------------------
2023-12-01T07:33:26.840+08:00

        从返回的结果可以看出,现在已经带时区信息,为东8区,并且与我系统时间一致。

时间戳-强转

         查询语句:

{
  "query": "SELECT 1701387000000::timestamp as ts, 1701387000000::date as dt",
  "time_zone":"Asia/Shanghai"
}

        返回结果:

           ts                              |                dt           
---------------------------------- -+------------------------------------
2023-11-30T23:30:00.000Z|2023-11-30T00:00:00.000Z

        从返回的结果可以看出,即便指定了时区参数,强转的日期,仍旧只会返回UTC时区值,而不受时区影响。

        通过采用CAST也是一样,不受时区参数影响:

{
  "query": "SELECT CAST('2023-11-30T23:30:00.000Z' AS TIMESTAMP) as ct",
  "time_zone":"Asia/Shanghai"
}

        返回结果:

                 ct           
------------------------------------
2023-11-30T23:30:00.000Z

时间戳-函数转换

        查询语句:

{
  "query": "SELECT DATETIME_FORMAT(1701387000000::TIMESTAMP,'yyyy-MM-dd HH:mm:ss.SSS') as df",
  "time_zone":"Asia/Shanghai"
}

        返回结果:

                  df           
----------------------------------
2023-12-01 07:30:00.000

        从返回的结果可以看出,即便指定了时区参数,强转的日期,人家只会返回UTC时区值。

日期解析-默认

        查询语句:

{
  "query": "SELECT DATETIME_PARSE('2023-11-30 23:30:00.000','yyyy-MM-dd HH:mm:ss.SSS') as dp",
  "time_zone":"Asia/Shanghai"
}

        返回结果:

                     dp              
--------------------------------------------
2023-11-30T23:30:00.000+08:00

        从返回的结果可以看出,指定了时区参数,则该日期即按指定的时区解析。

        

 日期解析-带时区

        查询语句:

{
  "query": "SELECT DATETIME_PARSE('2023-11-30 23:30:00.000 UTC','yyyy-MM-dd HH:mm:ss.SSS VV') as dp",
  "time_zone":"Asia/Shanghai"
}

        返回结果:

                      dp              
-------------------------------------------
2023-12-01T07:30:00.000+08:00

        从返回的结果可以看出,指定了时区参数,由于字符串中指定了时间为UTC,而参数指定了上海时区,则结果返回了上海时区的结果。

结论

  1. 强转日期时间不受时区参数影响;
  2. 函数转换日期会依据指定时区返回。

        

相关推荐

  1. [ES]ElasticSearch时间日期时区探讨

    2023-12-11 14:56:02       58 阅读
  2. MySQL日期时间处理

    2023-12-11 14:56:02       76 阅读
  3. Python时间日期探索datetime模块

    2023-12-11 14:56:02       94 阅读
  4. vue 时间日期格式处理

    2023-12-11 14:56:02       22 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-11 14:56:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-11 14:56:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-11 14:56:02       87 阅读
  4. Python语言-面向对象

    2023-12-11 14:56:02       96 阅读

热门阅读

  1. vscode连接远程服务器失败

    2023-12-11 14:56:02       56 阅读
  2. qt 双缓冲机制

    2023-12-11 14:56:02       56 阅读
  3. 【自动化构建】自动化构建精品代码片段

    2023-12-11 14:56:02       54 阅读
  4. 导行电磁波

    2023-12-11 14:56:02       44 阅读
  5. Leetcode(一)两数之和

    2023-12-11 14:56:02       61 阅读
  6. LeetCode-10. 正则表达式匹配

    2023-12-11 14:56:02       62 阅读
  7. LeetCode [简单]合并两个有序链表 (迭代

    2023-12-11 14:56:02       64 阅读
  8. 安卓11修改power按键功能

    2023-12-11 14:56:02       50 阅读
  9. QT DAY1

    QT DAY1

    2023-12-11 14:56:02      52 阅读
  10. Linux命令——网络管理

    2023-12-11 14:56:02       69 阅读
  11. netty使用

    2023-12-11 14:56:02       56 阅读
  12. PIN设备

    PIN设备

    2023-12-11 14:56:02      54 阅读