You need to enable JavaScript to run this app.
导航
NoSQL Date 类型详解
最近更新时间:2024.07.12 16:01:05首次发布时间:2024.07.12 16:01:05

如何解决 NoSQL 语法中拼 key 的主键字段生成的序列为日期序列而不是数字序列?

问题描述

常见的业务场景中,经常出现拼接 keyFormat 的主键中,且有一个主键对应业务中的实际日期,例如:
key_format 为 ${prefix}-${p_date}-${suffix},其中p_date对应业务的实际日期,如20230530,在创建的 API 中,希望查询某一个时间段的数据,例如在 where 条件中 p_date between and 20230530 and 20230602,在这种情况下:

  • 如果 p_date 是 bigint 类型(即整数类型),那么实际查询的日期序列是 20230530,20230531,20230532,20230533...,20230599,20230600,20230601,20230602;
  • 如果 p_date 是 date 类型,那么实际查询的日期序列是 20230530,20230531,20230601,20230602。

因此,如果希望生成的是日期序列,需要将逻辑表中的 p_date 字段类型从 bigint 类型(即整数类型)改成 date 类型,此时 p_date 的返回结果类型会变成 date,返回的数据格式会变成 string 类型的YYYY-MM-DD格式,例如'2023-05-30'

警告

由于 date 类型的返回结果是YYYY-MM-DD格式的 string 类型,所以对存量逻辑表进行 date 类型字段的改造是会改变已经发布 API 的返回结果类型!!!

API 请求和返回参数中的 Date 类型

NoSQL 语法中的 Date 类型,在请求参数和返回参数中,需要注意的点如下:

  1. 请求参数中,date 类型参数必须是YYYYMMDD格式的 bigint 类型
    在请求参数中 date 类型与 bigint 类型参数相似,区别在于 date 类型的参数出现在 between and 语句,>=, <= 运算符中时,这些语句生成的参数序列会过滤掉非法的日期格式参数。
    例如:
    • date 类型参数p_date,p_date between 20230530 and 20230602,生成的参数序列为:20230530,20230531,20230601,20230602;
    • bigint 类型参数p_date,p_date between 20230530 and 20230602,生成的参数序列为:20230530,20230531,20230523,20230524...,20230599,20230600,20230601,20230602;
  2. 作为返回参数,date 类型的返回结果,为YYYY-MM-DD格式的 String 类型

逻辑表中的 Date 类型

对于逻辑表中的逻辑字段字段来说,如果该字段类型是 Date,并且该逻辑字段对应的物理字段类型是 int 类型(即整数类型)或者 string 类型(即字符串类型),那么:

  • 如果逻辑字段类型对应的物理字段类型是 int 类型(即整数类型),则该逻辑字段的返回数据格式为 bigint 类型的YYYYMMDD格式,例如:20230530
  • 如果逻辑字段类型对应的物理字段类型是字符串类型,并且实际的存储格式满足YYYYMMDD格式,则该逻辑字段的返回数据格式为 string 类型的YYYY-MM-DD格式,例如:2023-05-30

物理表中的 Date 类型

对于物理表中的物理字段来说,如果该字段类型是 Date,那么在实际的数据源中,该字段类型与 String 类型相同,即在实际的数据源中,Date 类型字段是以 String 类型格式存储。

  • 对于 Hbase 数据源类型,Date 类型字段满足YYYYMMDD格式,例如:20230530
  • 对于 ES 数据源类型,Date 类型字段满足YYYY-MM-DD格式,例如:2023-05-30

Date 类型返回格式归一化

NoSQL 语法提供函数 date_normalize来归一化 Date 类型的返回格式为想要的类型。

date_normalize

  1. 函数签名
    date_normalize(param, data_type, date_format)

  2. 入参

    • param:满足YYYYMMDD日期格式的参数,例如20230522
    • data_type:返回数据类型,枚举值:intstring
    • date_format : 日期格式占位符的 string 类型参数

    pattern 格式

    含义

    实例

    %Y

    年,4位

    2022

    %m

    月,数值(00-12)

    06

    %d

    日,数值(0-31)

    30

  3. 出参
    特定格式的返回结果

示例

  1. data_typeint,入参为 bigint 类型

    date_normalize(p_date, 'int', '%Y%m%d')    // p_date 值为 bigint 类型的 20230418
    输出结果
    bigint 类型的 20230418
    
  2. data_typeint,入参为 string 类型

    date_normalize(p_date, 'int', '%Y%m%d')    // p_date 值为 string 类型的'20230418'
    输出结果
    bigint 类型的 20230418
    
  3. data_typestring,入参为 bigint 类型

    date_normalize(p_date, 'string', '%Y-%m-%d')    // p_date 值为 20230418
    输出结果
    string 类型的 '2023-04-18'
    
  4. data_typestring,入参为 string 类型

    date_normalize(p_date, 'string', '%Y/%m/%d')    // p_date 值为 '20230418'
    输出结果
    string 类型的 '2023/04/18'
    
    date_normalize(p_date, 'string', '%Y%m%d')    // p_date 值为 '20230418'
    输出结果
    string 类型的 '20230418'