数据库中的时间概念
数据库以关系形式用于模拟外部现实世界某些部分的状态。数据库系统通常只存储一种状态,即现实世界的当前状态,并且不保存有关先前和过去状态的数据,除非有时将其用作审计线索。如果现实世界的当前状态发生变化,数据库就会被编辑和更新,关于先前状态的信息就会丢失。
但是,在大多数实际应用中,存储和检索先前状态的信息非常重要。例如,学生数据库必须包含该学生过去的表现历史信息,才能生成最终结果。为了成功采取行动,自主机器人系统必须保留来自环境的当前和历史传感器数据。
以下是数据库中一些常见的时间使用方式,以及使用时间相关功能的示例和语法 -
时间戳
时间戳用于记录特定记录的创建或修改日期和时间。在大多数数据库中,时间戳会在插入或更新记录时自动生成。
在 MySQL 中创建包含时间戳列的表的语法 -
CREATE TABLE example_table (
id INT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Output Table
+------------+--------------------------------------+ | 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"聚类。数据也基于1天的时间窗口进行压缩。
时区
处理记录在不同时区的数据时,根据需要正确转换时区非常重要。
在 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
结论
总而言之,时间是数据库中的一个重要概念,其用途多种多样。时间戳用于记录特定记录的创建或修改日期和时间,而基于时间的分区则用于提高处理大型数据集时的性能。处理以不同时区记录的数据时,根据需要在时区之间进行正确的转换非常重要。最后,历史数据用于跟踪随时间的变化,通常存储在单独的表中。总而言之,了解数据库中时间的不同使用方式对于构建健壮且可扩展的应用程序至关重要。

