今天在设计数据库表的时候需要给created_time updated_time 分配数据存储类型
想到存时间戳(timestamp)和 datetime的区别 。
问了一下chat:
请问 timestamp这个从1970年开始的时间戳 和正常使用的 datetime有什么区别吗
在关系数据库中,TIMESTAMP
和 DATETIME
是表示日期和时间的数据类型,它们在功能上有一些区别:0000
? ? ? ? ?168421
范围和存储方式:
DATETIME
数据类型存储范围是 '1000-01-01 00:00:00'
至 '9999-12-31 23:59:59'
,占用 8 字节的存储空间。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TIMESTAMP
数据类型存储范围是 '1970-01-01 00:00:01'
UTC 到 '2038-01-19 03:14:07'
UTC,占用 4 字节的存储空间。这个范围受限于 32 位整数的最大值,因此存在所谓的“2038年问题”。? ? ? ? ? ? ? ? 注:UTC格林威治时间(1)↓↓↓↓↓
时区处理:
DATETIME
不会考虑时区,它是存储特定日期和时间的数据类型。TIMESTAMP
存储的是相对于 UTC(协调世界时)的时间戳,并在存储时会将其转换为 UTC,读取时也会根据当前时区进行相应的转换。自动更新行为:
TIMESTAMP
类型的列可以设置为默认值为 CURRENT_TIMESTAMP
,这样当一行数据被创建或更新时,这个字段会自动记录当前的时间戳。而 DATETIME
类型的列需要在插入或更新数据时手动指定值。存储空间:
TIMESTAMP
占用的存储空间更小,因为它只存储了一个时间戳,而不是完整的日期和时间信息。总的来说,TIMESTAMP
更适合用于记录与时间相关的操作,尤其是需要考虑时区的情况,而 DATETIME
更适合用于存储特定的日期和时间信息,不涉及时区转换。
????????为什么会有2038年危机 。
在一般的电脑中,int占用4字节,32比特,数据范围为-2147483648~2147483647[-2^31~2^31-1]
无符号整型(unsigned int )占4个字节,范围 0 ~ 4294967295
(1):在19世纪末和20世纪初,国际上为了解决全球航海和铁路运输中出现的时间标准问题,选择了格林威治天文台的子午线作为参考点。1884年,格林威治子午线被选定为国际时间的基准线,也就是世界时(UTC)的起点。这条子午线穿过伦敦郊区的格林威治天文台。
协调世界时(UTC)是世界上的标准时间。它是基于原子钟的时间,被视为全球的时间标准,不受任何地区或国家的影响。UTC 不受太阳时间、地球自转等因素影响,是一种由国际原子时(TAI)通过精确的原子钟测量得出的时间标准。
????????为什么是1970年?????????
因为Unix 操作系统 在1969年开始被开发,在1971年正式被发表,所以最初规定的时间戳是从 1971 年1月1日 00:00:00开始,但是后来为了方便计算就取了个整数,就改到了1970年。