如何解决 NoSQL 语法中拼 key 的主键字段生成的序列为日期序列而不是数字序列?
常见的业务场景中,经常出现拼接 keyFormat 的主键中,且有一个主键对应业务中的实际日期,例如:
key_format 为 ${prefix}-${p_date}-${suffix}
,其中p_date
对应业务的实际日期,如20230530
,在创建的 API 中,希望查询某一个时间段的数据,例如在 where 条件中 p_date between and 20230530 and 20230602
,在这种情况下:
因此,如果希望生成的是日期序列,需要将逻辑表中的 p_date 字段类型从 bigint 类型(即整数类型)改成 date 类型,此时 p_date 的返回结果类型会变成 date,返回的数据格式会变成 string 类型的YYYY-MM-DD
格式,例如'2023-05-30'
警告
由于 date 类型的返回结果是YYYY-MM-DD
格式的 string 类型,所以对存量逻辑表进行 date 类型字段的改造是会改变已经发布 API 的返回结果类型!!!
NoSQL 语法中的 Date 类型,在请求参数和返回参数中,需要注意的点如下:
YYYYMMDD
格式的 bigint 类型p_date
,p_date between 20230530 and 20230602,生成的参数序列为:20230530,20230531,20230601,20230602;p_date
,p_date between 20230530 and 20230602,生成的参数序列为:20230530,20230531,20230523,20230524...,20230599,20230600,20230601,20230602;YYYY-MM-DD
格式的 String 类型对于逻辑表中的逻辑字段字段来说,如果该字段类型是 Date,并且该逻辑字段对应的物理字段类型是 int 类型(即整数类型)或者 string 类型(即字符串类型),那么:
YYYYMMDD
格式,例如:20230530
YYYYMMDD
格式,则该逻辑字段的返回数据格式为 string 类型的YYYY-MM-DD
格式,例如:2023-05-30
对于物理表中的物理字段来说,如果该字段类型是 Date,那么在实际的数据源中,该字段类型与 String 类型相同,即在实际的数据源中,Date 类型字段是以 String 类型格式存储。
YYYYMMDD
格式,例如:20230530
YYYY-MM-DD
格式,例如:2023-05-30
NoSQL 语法提供函数 date_normalize
来归一化 Date 类型的返回格式为想要的类型。
date_normalize
函数签名date_normalize
(param
, data_type
, date_format
)
入参
param
:满足YYYYMMDD
日期格式的参数,例如20230522
data_type
:返回数据类型,枚举值:int
和 string
date_format
: 日期格式占位符的 string 类型参数pattern 格式 | 含义 | 实例 |
---|---|---|
%Y | 年,4位 | 2022 |
%m | 月,数值(00-12) | 06 |
%d | 日,数值(0-31) | 30 |
出参
特定格式的返回结果
data_type
为int
,入参为 bigint 类型
date_normalize(p_date, 'int', '%Y%m%d') // p_date 值为 bigint 类型的 20230418 输出结果 bigint 类型的 20230418
data_type
为int
,入参为 string 类型
date_normalize(p_date, 'int', '%Y%m%d') // p_date 值为 string 类型的'20230418' 输出结果 bigint 类型的 20230418
data_type
为string
,入参为 bigint 类型
date_normalize(p_date, 'string', '%Y-%m-%d') // p_date 值为 20230418 输出结果 string 类型的 '2023-04-18'
data_type
为string
,入参为 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'