Mysql中多种日期类型——DATETIME、TIMESTAMP、TIME、YEAR、DATE的区分
问题描述
Mysql设置time时,会提示多种time格式。使用go语言的time.Time类型,又更容易混肴,因此做一下区分。
time类型
time类型保存的是一个时分秒,比如10:00:00
这样的内容。和go语言中的time.Time格式完全不是一回事。
同样的,还有YEAR类型,则是只保存一个年份。
DATE类型则是只保存年月日。
datetime和timestamp类型
这两个比较容易混肴还是,之前一直也没搞懂。顺带吐槽一下Google这个智能推荐的答案,这说了个啥呢…
二者存储的内容相同,均为 YYYY-MM-DD HH:MM:SS
区别
1、占用大小不同:
DATETIME 8字节
TIMESTAMP 4字节。
2、取值范围不同:
DATETIME类型范围: '1000-01-01 00:00:00'~'9999-12-3 23:59:59'
TIMESTAMP类型范围: '1970-01-01 00:00:01'UTC~'2038-01-19 03:14:07'UTC
3、存储时区不同:
DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;
TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,检索时再转换回当前时区。即查询时,根据当前时区的不同,显示的时间值是不同的。
总结
1 在满足使用条件的情况下,占据存储空间越少越好,此时选择timestamp比datetime更好.
2 timestamp类型的存储,是以UTC时区来保存的,在显示时会自动将日期数据转换,如果时间的场景对应多个时区,此时选择timestamp比datetime更好.
3 关于日期的使用范围, timestamp类型最大只支持到2038-01-19年,所以如果使用的日期时间较大, 则选择datetime比timestamp更好.
贴一个 另一个博文的总结
但对我而言,我觉得在数据量不大、不存在跨国业务的数据库时候,用DATETIME会方便一些。因为这样可以避免因时区问题导致的错误。
直接引用一张图来对比方便。 图源
IT民工锦里: 下面是for range遍历 0 1 0xc00000a0e0 0xc00000a0b8 1 2 0xc00000a0f8 0xc00000a0f0 2 3 0xc00000a110 0xc00000a108 下面是for遍历 0 1 0xc00000a120 0xc000010120 1 2 0xc00000a130 0xc000010128 2 3 0xc00000a140 0xc000010130 我跑出来的结果也没你说的现象?
IT民工锦里: //expect: 1 2 fmt.Println(*res[0],*res[1]) //but output: 2 2,这个编辑器跑出来,输出的就是1.2啊
而鱼儿and-fish: 你是正确的,这个社区有些人连抄都要抄个错误的
Climber47: 愣是没想到,这个博文钓出来那么多学弟学妹,收藏破百了都。
普通网友: 写的很详细,感谢博主的分享。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】