多元索引支持丰富的日期数据类型,您可以将数据表中整型(Integer)或者字符串(String)类型的数据在多元索引中映射为日期数据类型。当通过多元索引进行范围查询时,使用日期数据类型查询会比使用字符串类型查询更快。

精度和范围

日期类型支持的最大精度是纳秒,日期类型数据的取值范围为["1970-01-01 00:00:00.000000000", "2262-04-11 23:47:16.854775807"]

日期格式

数据表中的字段类型映射到多元索引的日期类型时,日期类型的格式支持设置,详细说明请参见下表。

数据表中字段类型 多元索引日期类型的格式(Format)
整型(Integer) 支持选择预定义格式。预定义格式包括如下选项:
  • "epoch_second":表示秒时间戳,例如秒时间戳"1218197720"对应的时间为"2008-08-08 20:15:20"。
  • "epoch_millis":表示毫秒时间戳,例如毫秒时间戳"1218197720123"对应的时间为"2008-08-08 20:15:20.123"。
  • "epoch_micros":表示微秒时间戳,例如微秒时间戳"1218197720123456"对应的时间为"2008-08-08 20:15:20.123456"。
  • "epoch_nanos":表示纳秒时间戳,例如纳秒时间戳"1218197720123456789"对应的时间为"2008-08-08 20:15:20.123456789"。
字符串(String) 支持自定义格式。常用日期格式如下:
  • yyyy-MM-dd HH:mm:ss.SSS
  • yyyyMMdd HHmmss
  • yyyy-MM-dd'T'HH:mm:ss.SSSX

其中yyyy表示4位的年份,MM表示月份,dd表示天,HH表示24小时制,mm表示分钟,ss表示秒,SSS表示秒的精度,X表示时区偏移量。

关于自定义日期格式规则的更多信息,请参见自定义日期格式规则

自定义日期格式规则

符号 含义 示例
y 年份
  • yyyy:2008
  • yy:08
M 月份
  • M:7
  • MM:07
d 月分中的第几天
  • d:8
  • dd:08
a 上午(AM)或者下午(PM)标记
  • a:AM
  • a:PM
K AM或者PM中的小时,取值范围为0~11
  • K:0
  • KK:00
H 一天中的小时,取值范围为0~23
  • H:0
  • HH:00
m 分钟
  • m:1
  • mm:01
s
  • s:1
  • ss:01
S 秒的精度,支持1~9个数字
  • S:3
  • SSS:234
  • SSSSSSSSS:123456789
X 时区偏移
  • X:+01;Z
  • XX:+0130;Z
  • XXX:+01:30;Z
  • XXXX:+013015;Z
  • XXXXX:+01:30:15;Z
x 时区偏移
  • x:+01;+00
  • xx:+0130;+0000,
  • xxx:+01:30;+00:00
  • xxxx:+013015;+0000
  • xxxxx:+01:30:15
' 自定义符号限定符 A~Z和a~z字符为特殊符号,当添加自定义字符串时,需要使用单引号包括。
注意 空格和短划线(-)不需要使用单引号包括。
'' 转义单引号 ''

日期格式合法性验证

使用日期格式查询数据前,建议您通过如下方式验证日期格式是否合法。

  • 通过创建包含指定日期格式的多元索引后,使用精确查询(TermQuery)进行验证
    public void testDateFormat(SyncClient client, String tableName, String indexName) {
        // 创建多元索引。
        CreateSearchIndexRequest request = new CreateSearchIndexRequest();
        request.setTableName(tableName);
        request.setIndexName(indexName);
        IndexSchema indexSchema = new IndexSchema();
        indexSchema.setFieldSchemas(Arrays.asList(
            new FieldSchema("col_date", FieldType.DATE)
            .setIndex(true)
            .setEnableSortAndAgg(true)
            .setDateFormats(Arrays.asList("yyyy-MM-dd HH:mm:ss.SSS"))
        ));
        request.setIndexSchema(indexSchema);
        client.createSearchIndex(request);
        // 验证日期格式。如果查询不报错,则日期格式正确。
        client.search(SearchRequest.newBuilder()
                      .tableName(tableName)
                      .indexName(indexName)
                      .searchQuery(SearchQuery
                                   .newBuilder()
                                   .query(QueryBuilders.term("col_date", "2012-12-12 12:10:03.123")).build())
                      .build());
    }
  • 通过JDK8及以上版本的DateTimeFormatter进行验证
    说明 此方式在测试某些时区时可能存在误差。
    
    import java.time.format.DateTimeFormatter;
    
    public void testFormatByJdk8() {
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").parse("2012-12-12 12:10:03.123");
    }