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

news/2024/7/7 6:34:42 标签: elasticsearch, es

问题

        由于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. 函数转换日期会依据指定时区返回。

        


http://www.niftyadmin.cn/n/5262559.html

相关文章

Webpack cl4 配置

基本配置: module.exports defineConfig({transpileDependencies: false,lintOnSave: false,outputDir: process.env.VUE_APP_DIST, // 打包后文件的目录publicPath: ./, // 静态资源路径(默认/,打包后会白屏)assetsDir: static…

Future设计模式

Future设计模式,针对长时间执行任务场景,提供了一种凭据式解决方案。Future提供了获取计算结果和判断是否完成的两个方法,其中获取计算结果将会导致调用阻塞(在任务未完成的情况下)。 示例代码如下: publi…

步进电机驱动芯片TB6600HG部分翻译

有些参数没看懂。一边设计,一边修正。 目录 1.芯片梗概 2.引脚配置 1)引脚含义 2)内部逻辑 3.功能详解 1)励磁模式设置 2)功能设置 3)初始模式 4)100% 电流设置(电流值) 5)OSC 6)衰减…

Windows进程机制

进程 进程要做任何事情,必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候,会自动为进程创建第一个线程,这称为主线程(…

椋鸟C语言笔记#27:字符串数字提取(atoi、atol、atoll、atof)

萌新的学习笔记,写错了恳请斧正。 目录 atoi 模拟实现 atol与atoll(C99起) atof 合法的浮点值 返回值 使用示例 在stdlib.h中还有几个有意思的字符串函数 它们的功能是将字符串开头的数字提取出来 下面我们具体看一看这几个函数吧 …

Android14创建Pixel6 Pro模拟器(一百七十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

数字图像处理(实践篇)二十四 使用dlib实现人脸对齐

目录 1 安装依赖库 2 下载shape_predictor_68_face_landmarks.dat文件 3 人脸对齐方案 4 涉及的函数 5 实践 1 安装依赖库 使用如下命令即可安装dlib: pip install dlib 在使用

修改jvm对象的属性值(私有)

修改jvm对象的属性值(私有) 这个想法的来源 一个spark job 在启动之后,就会确定 executor 的数量。但是存在一种情况,当我的队列资源宽松 可能就要调整一些job的资源,但是spark job在启动的时候,最大的资源就确定了,…