数据库中的时间概念


数据库以关系的形式使用,用来模拟外部现实世界某一部分的状态。一般来说,数据库系统只存储一个状态,即现实世界的当前状态,并且不保留关于先前和过去状态的数据,除非有时作为审计跟踪。如果现实世界的当前状态发生变化,数据库就会被编辑和更新,而关于先前状态的知识就会丢失。

但是,在大多数现实世界的应用程序中,存储和检索关于先前状态的信息非常重要。例如,学生数据库必须包含关于该学生过去学习成绩的历史信息,以便准备最终成绩。为了成功地采取行动,自主机器人系统必须保留关于当前和历史环境传感器数据的知识。

以下是数据库中使用时间的一些常见方法,以及使用与时间相关的功能的示例和语法:

时间戳

时间戳用于记录特定记录创建或修改的日期和时间。在大多数数据库中,时间戳在记录插入或更新时自动生成。

在 MySQL 中创建包含时间戳列的表的语法:

CREATE TABLE example_table (
    id INT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

输出表

+------------+--------------------------------------+
| Column     | Type                                 |
+------------+--------------------------------------+
| id         | INT                                  |
| created_at | TIMESTAMP DEFAULT CURRENT_TIMESTAMP  |
+------------+--------------------------------------+
| PRIMARY KEY| (id)                                 |
+------------+--------------------------------------+

插入包含当前时间戳的记录的示例:

INSERT INTO example_table (id) VALUES (1);

输出表

+----+---------------------+
| id | created_at          |
+----+---------------------+
|  1 |                     |
+----+---------------------+

基于时间的分区

基于时间的分区用于在处理大型数据集时提高性能,方法是根据时间将数据分成更小、更易于管理的块。

在 Apache Cassandra 中创建基于时间的表的分区表的语法:

CREATE TABLE example_table (
    id INT,
    created_at TIMESTAMP,
    value TEXT,
    PRIMARY KEY ((id), created_at)
) WITH CLUSTERING ORDER BY (created_at DESC)
    AND compaction = {'class': 'TimeWindowCompactionStrategy',
       'compaction_window_size': '1', 
       'compaction_window_unit': 'DAYS'};

输出表

+------------+--------------+--------------------------------------------+
| Column     | Type         | Modifiers                                  |
+------------+--------------+--------------------------------------------+
| id         | INT          | PRIMARY KEY                                |
| created_at | TIMESTAMP    | PRIMARY KEY                                |
| value      | TEXT         |                                            |
+------------+--------------+--------------------------------------------+
| CLUSTERING | ORDER BY     | (created_at DESC)                          |
+------------+--------------+--------------------------------------------+
| compaction | TimeWindow   | {'class': 'TimeWindowCompactionStrategy', 
|            |  Strategy    | 'compaction_window_size': '1', 
|            |              | 'compaction_window_unit': 'DAYS'}          |
+------------+--------------+--------------------------------------------+

这将创建一个表,其中数据按“id”分区,并按“created_at”聚类。数据也基于一天的时间窗口进行压缩。

时区

在处理以不同时区记录的数据时,必须根据需要正确转换时区。

在 PostgreSQL 中将时间戳转换为不同时区的语法:

SELECT created_at AT TIME ZONE 'UTC' AT TIME ZONE 'America/New_York' FROM example_table;

这将“created_at”时间戳转换为东部时间区。

输出表

+------------------------+
| timezone_adjusted_time |
+------------------------+
| 2023-03-18 08:00:00-04 |
| 2023-03-17 23:30:00-04 |
| 2023-03-17 15:15:00-04 |
| 2023-03-17 10:00:00-04 |
+------------------------+

历史数据

历史数据用于跟踪随时间的变化。在大多数数据库中,这是通过创建一个单独的表来完成的,该表存储对特定记录所做的更改的历史记录。

在 SQL Server 中创建历史表的语法:

CREATE TABLE example_table_history (
    id INT,
    created_at TIMESTAMP,
    value TEXT,
    changed_at TIMESTAMP,
    changed_by TEXT
);

这将创建一个单独的表来跟踪对“example_table”表所做的更改。每当“example_table”表中的记录被修改时,都会在“example_table_history”表中添加一条新记录,其中包含当前时间戳、进行更改的用户以及记录的旧值。

让我们向表中插入一些值:

INSERT INTO example_table_history (id, created_at, value, changed_at, changed_by)
VALUES (1, '2022-01-01 12:00:00', 'Value 1', '2022-01-02 12:00:00', 'User 1'),
       (2, '2022-02-01 12:00:00', 'Value 2', '2022-02-02 12:00:00', 'User 2'),
       (3, '2022-03-01 12:00:00', 'Value 3', '2022-03-02 12:00:00', 'User 3');
SELECT * FROM example_table_history;

输出表

id | created_at           | value   | changed_at           | changed_by
---|----------------------|---------|----------------------|------------
1  | 2022-01-01 12:00:00  | Value 1 | 2022-01-02 12:00:00  | User 1
2  | 2022-02-01 12:00:00  | Value 2 | 2022-02-02 12:00:00  | User 2
3  | 2022-03-01 12:00:00  | Value 3 | 2022-03-02 12:00:00  | User 3

结论

总而言之,时间是数据库中的一个重要概念,它以许多不同的方式使用。时间戳用于记录特定记录的创建或修改日期和时间,而基于时间的分区用于在处理大型数据集时提高性能。在处理以不同时区记录的数据时,必须根据需要正确转换时区。最后,历史数据用于跟踪随时间的变化,通常存储在单独的表中。总的来说,了解时间在数据库中使用的不同方式对于构建健壮且可扩展的应用程序至关重要。

更新于:2023年9月7日

314 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.