Passer au contenu principal
Permet de stocker un instant, pouvant être exprimé sous la forme d’une date calendaire et d’une heure de la journée, avec une précision inférieure à la seconde définie Taille du tick (précision) : 10-precision secondes. Plage valide : [ 0 : 9 ]. Les valeurs généralement utilisées sont 3 (millisecondes), 6 (microsecondes) et 9 (nanosecondes). Valeur par défaut : 3 (millisecondes). Syntaxe :
DateTime64(precision, [timezone])
En interne, les données sont stockées sous la forme d’un certain nombre de « ticks » depuis le début de l’epoch (1970-01-01 00:00:00 UTC), sous forme d’Int64. La résolution des ticks est déterminée par le paramètre precision. De plus, le type DateTime64 peut stocker un fuseau horaire identique pour toute la colonne, ce qui affecte la façon dont les valeurs du type DateTime64 sont affichées au format texte ainsi que la façon dont les valeurs spécifiées sous forme de chaînes sont interprétées (‘2020-01-01 05:00:01.000’). Le fuseau horaire n’est pas stocké dans les lignes de la table (ou dans le resultset), mais dans les métadonnées de la colonne. Voir les détails dans DateTime. Plage de valeurs prise en charge : [1900-01-01 00:00:00, 2299-12-31 23:59:59.999999999] Le nombre de chiffres après le séparateur décimal dépend du paramètre precision. Remarque : la précision de la valeur maximale est de 8. Si la précision maximale de 9 chiffres (nanosecondes) est utilisée, la valeur maximale prise en charge est 2262-04-11 23:47:16 en UTC.

Exemples

  1. Création d’une table avec une colonne de type DateTime64 et insertion de données dans cette table :
CREATE TABLE dt64
(
    `timestamp` DateTime64(3, 'Asia/Istanbul'),
    `event_id` UInt8
)
ENGINE = MergeTree;
-- Parse DateTime
-- - from an integer interpreted as the number of milliseconds (because of precision 3) since 1970-01-01,
-- - from a decimal interpreted as the number of seconds before the decimal part, and based on the precision after the decimal point,
-- - from a string.

INSERT INTO dt64
VALUES
(1546300800123, 1),
(1546300800.123, 2),
('2019-01-01 00:00:00', 3);

SELECT * FROM dt64;
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │        1 │
│ 2019-01-01 03:00:00.123 │        2 │
│ 2019-01-01 00:00:00.000 │        3 │
└─────────────────────────┴──────────┘
  • Lors de l’insertion d’une valeur datetime sous forme d’entier, elle est traitée comme un timestamp Unix (UTC) correctement mis à l’échelle. 1546300800000 (avec une précision de 3) représente '2019-01-01 00:00:00' UTC. Cependant, comme la colonne timestamp utilise le fuseau horaire Asia/Istanbul (UTC+3), lors de l’affichage sous forme de chaîne, la valeur sera affichée comme '2019-01-01 03:00:00'. Lors de l’insertion d’une valeur datetime sous forme décimale, elle est traitée de manière similaire à un entier, à ceci près que la valeur avant le point décimal correspond au timestamp Unix jusqu’aux secondes incluses, et la partie après le point décimal est traitée comme la précision.
  • Lors de l’insertion d’une valeur de chaîne comme datetime, elle est considérée comme étant dans le fuseau horaire de la colonne. '2019-01-01 00:00:00' sera considéré comme appartenant au fuseau horaire Asia/Istanbul et stocké sous la forme 1546290000000.
  1. Filtrage sur les valeurs DateTime64
SELECT * FROM dt64 WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul');
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │        3 │
└─────────────────────────┴──────────┘
Contrairement à DateTime, les valeurs DateTime64 ne sont pas automatiquement converties depuis String.
SELECT * FROM dt64 WHERE timestamp = toDateTime64(1546300800.123, 3);
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │        1 │
│ 2019-01-01 03:00:00.123 │        2 │
└─────────────────────────┴──────────┘
Contrairement à l’opération insert, la fonction toDateTime64 traite toutes les valeurs comme des valeurs décimales ; la précision doit donc être indiquée après la virgule.
  1. Récupération du fuseau horaire d’une valeur de type DateTime64 :
SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS x;
┌──────────────────column─┬─x──────────────────────────────┐
│ 2023-06-05 00:09:52.000 │ DateTime64(3, 'Asia/Istanbul') │
└─────────────────────────┴────────────────────────────────┘
  1. Conversion de fuseaux horaires
SELECT
toDateTime64(timestamp, 3, 'Europe/London') AS lon_time,
toDateTime64(timestamp, 3, 'Asia/Istanbul') AS istanbul_time
FROM dt64;
┌────────────────lon_time─┬───────────istanbul_time─┐
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
└─────────────────────────┴─────────────────────────┘
Voir aussi
Dernière modification le 25 juin 2026