全部產品
Search
文件中心

Tablestore:日期時間類型

更新時間:Sep 10, 2024

多元索引支援豐富的日期時間(Date)類型,您可以將資料表中整型(Integer)或者字串(String)類型的資料在多元索引中映射為日期資料類型。當通過多元索引進行範圍查詢時,使用日期資料類型查詢會比使用字串類型查詢更快。

精度和範圍

日期時間類型支援的最大精度是納秒,日期時間類型資料的取值範圍為["1970-01-01 00:00:00.000000000", "2262-04-11 23:47:16.854775807"]

日期格式

當資料表中的Integer或String類型映射到多元索引的Date類型時,日期時間類型的格式支援進行設定,詳細說明請參見下表。

資料表中欄位類型

多元索引中日期時間類型的格式(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)或者JDK8及以上版本的DateTimeFormatter方式驗證日期格式的合法性。

通過TermQuery進行驗證

建立包含指定日期格式的多元索引後,使用精確查詢(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", "2022-12-12 12:10:03.123")).build())
                  .build());
}

通過DateTimeFormatter進行驗證

重要
  • 此方式在測試某些時區時可能存在誤差。

  • 請確保已安裝JDK8及以上版本的開發環境。

通過JDK的DateTimeFormatter方法驗證日期類型的合法性。如果代碼執行不報錯,則日期格式正確。


import java.time.format.DateTimeFormatter;

public void testFormatByJdk8() {
    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS").parse("2022-12-12 12:10:03.123");
}

相關文檔