MySQL时间字段TIMESTAMP、DATETIME(自动更新、毫秒存储)

本文介绍了MySQL中DATE、TIME、DATETIME和TIMESTAMP四种数据类型,详细阐述了它们的格式、范围以及使用注意事项。TIMESTAMP具有时区转换功能,而DATETIME存储范围更广。在默认值和自动更新方面,两者都可设置为CURRENT_TIMESTAMP。此外,TIMESTAMP能支持毫秒精度,并可通过(n)指定精度。建议在声明字段时明确指定这些特性。

1. 数据类型简介

MySQL中关于日期和时间有DATE、TIME、DATETIME、TIMESTAMP这几种数据类型:

  • 1️⃣DATE:储存日期,格式为YYYY-MM-DD,范围1000-01-019999-12-31
  • 2️⃣TIME:储存时间,格式为hhh:mm:ss,范围-838:59:59838:59:59
  • 3️⃣DATETIME:储存日期和时间,格式为YYYY-MM-DD hh:mm:ss,范围1000-01-01 00:00:009999-12-31 23:59:59
  • 4️⃣TIMESTAMP:储存时间戳,格式与DATETIME相同,范围1970-01-01 00:00:012038-01-19 03:14:07

赋值时通过上述格式的字符串赋值即可,还有一些如同NOW()之类的函数也可赋值,但本质可以理解为返回了格式化字符串后赋值的。

其中的TIME可以有缩写,但❌十分不建议❌这样做:

  • 1112将被转化为00:11:12
  • 11:12将被转化为11:12:00

类似地,DATE也可以简写,参考官方文档📖2-Digit Years in Dates

对于后两者(DATETIMETIMESTAMP)很类似,又有所不同:

1️⃣☀️首先能够轻松注意到TIMESTAMP的储存范围比DATETIME小很多,那简单一想:

正经人谁还用TIMESTAMP啊❓

从官方介绍中了解到,TIMESTAMP在存储时会存成UTC时间,在取出时转换为服务器的所在时区时间。因此能够提供时区自动变换的功能,不过看起来不是跨国大鳄🐊也不太用得上这功能……

UTC:协调世界时,又称世界统一时间

2️⃣🌔在未指定默认值时,TIMESTAMPDATETIME的默认值根据是否允许NULL值有区别:

// DATETIME默认允许NULL值,指定不允许NULL时默认值为0
CREATE TABLE t1 (
  dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
  dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
);
// TIMESTAMP默认不允许NULL值,指定允许NULL时默认值为NULL
CREATE TABLE t1 (
  ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
  ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
);

💡建议:这种知识点🔖不建议去记,在声明字段时显式指出☝️即可。

有兴趣可以参考官方文档📖The DATE, DATETIME, and TIMESTAMP Types

2. 方便的处理

2.1 默认值与自动更新

TIMESTAMPDATETIME类型字段,都可以将当前时间戳指定为默认值和/或自动更新值,只需要在创建表格时添加DEFAULT描述和ON UPDATE描述:

// ts和dt将在创建和修改时,被赋值为当前时间
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

官方文档提到CURRENT_TIMESTAMP有很多同义词,他们效果相同:

  • NOW()
  • CURRENT_TIMESTAMP()
  • LOCALTIME/LOCALTIME()
  • LOCALTIMESTAMP/LOCALTIMESTAMP()

2.2 毫秒及更高精度

可以在声明字段时添加小数点精度,只需要在TIMESTAMP后添加(n)即可,其中0 ≤ n ≤ 6

❗️❗️❗️但要注意:声明时各处的小数精度要一致,如:

CREATE TABLE t1 (
  ts TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),--正确
  dt DATETIME(4) DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(6) -- 错误
);

有兴趣可以参考官方文档📖Fractional Seconds in Time Values


如有错误 ❌ ,欢迎指正 ☝️~

如有收获 🍗,点赞👍/评论💬/收藏⭐️/关注👀~

### 关于 DateTime 毫秒级别精度处理 #### C# 中实现毫秒级精度的时间操作 在C#中,可以利用扩展方法来确保 `DateTime` 对象具有毫秒级别的精度。通过定义一个名为 `ToMillisecondPrecision` 的静态公共函数作为 `DateTime` 类型的方法扩展,能够有效地截取并返回带有毫秒精度的日期时间对象。 ```csharp public static class DateTimeExtensions { public static DateTime ToMillisecondPrecision(this DateTime d) { return new DateTime(d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second, d.Millisecond); } } ``` 此代码片段展示了如何创建一个简单的扩展方法用于调整 `DateTime` 实例至最近的毫秒位置[^1]。 #### SQL 数据库中的毫秒级精度支持 对于关系型数据库而言,在SQL语句里声明列时指定其时间字段应具备何种程度上的精确度是非常重要的。例如,在Oracle数据库环境中设置表结构时可以通过如下方式设定某一特定列允许存储带有多达六位小数部分表示纳秒级别的 `TIMESTAMP` 值: ```sql CREATE TABLE example_table ( id INT PRIMARY KEY, event_time TIMESTAMP(6) ); ``` 而在 MySQL 和 SQL Server 这样的主流RDBMS平台下,则分别提供了不同的机制以适应更高分辨率的需求。MySQL 自版本5.6起引入了对微秒的支持;而 SQL Server 则允许用户配置 `DATETIME2(n)` 或者 `TIME(n)` 来保存更精细的时间间隔信息,其中 n 表示所期望达到的最大分数秒长度 (范围是从 0 至 7)[^2][^4]. #### Python 下获取高精度计时器读数 Python 提供了几种途径用来测量程序执行期间经过的实际物理钟表时间。一种常见做法就是借助内置模块 `datetime`, 它不仅包含了完整的日历功能还集成了可选参数使得实例化出来的对象能携带额外的小数位数反映更加细致入微的变化情况: ```python from datetime import datetime start_dt = datetime.now() print(f'Start Time: {start_dt}') # Simulate some operation... import time; time.sleep(.3) end_dt = datetime.now() elapsed_ms = int((end_dt - start_dt).total_seconds() * 1_000) print(f'End Time: {end_dt}') print(f'Total Elapsed Milliseconds: {elapsed_ms} ms') ``` 上述脚本说明了怎样运用 `datetime.now()` 函数捕获当前时刻,并且计算两个不同瞬间之间相差了多少个千分之一秒钟即所谓的“毫秒”。值得注意的是这里采用了 `.total_seconds()` 方法乘上一千转换成整数值以便直观理解[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值