首页 > 编程知识 正文

数据库日期时间类型,数据库time数据类型

时间:2023-05-05 20:46:29 阅读:173905 作者:1625

1.mongo mongoISODate是一种保存时间的对象,最大支持毫秒精度。 保存到纳秒精度时,建议使用长时间保存时间戳的方法。

golang time.Time是具有时区的时间,保存到Mongo会将驱动程序转换为ISODate类型。 ISODate类型在数据库中保存为UTC时间,ISODate.toLocaleString ()显示具有当前时区的字符串。

是go mongo驱动程序在读取时未转换为当前时区,还是UTC时区保存在time.Time中,即time.Time.loc=nil //nil为UTC。

注:

如果time.Time作为map的一个元素,存入mongo时,则time.Time类型转化会有问题,见: https://stack overflow.com/questions/49657422/using-time-time-in-mongodb- record

golang time.Time的时间精度是到纳秒[0,999999999],所以如果是取的time.Now()存入mongo后再取出,与之前的变量比较即使时区一样两者也是不相等的。因为精度有损失。

2.MySQLmysql的表达时间分别是DATE、TIME、DATETIME、TIMESTAMP和YEAR .与他们相对应的零值分别是‘0000-00-00’、‘

DATE、DATETIME和TIMESTAMP的最大精度为微秒(6位),在字段后面填写6进行使用。 如果省略标注,则默认值为0。 如果表中定义的小数位数小于实际值,则保存时会截断实际值并进行四舍五入。从MySQL 5.6.4开始, 存储在DATETIME或TIMESTAMP列中的值中的任何小数部分 都会存储而不是丢弃。

DATE

范围: 1000-01-01~9999-12-31、mysql以“YYYY-MM-DD”格式显示,可以使用字符串或数字格式分配给列存储

DATETIME:

范围:从“1000-01-0100336000336000.000000”到“9999-12-312:59336059.9999999”,mysql表示“yyyy-mm-DDHD3360mm3360mm

TIMESTAMP

范围:从“1970-01-0100336000336001.000000”utc到“2038-01-190:14336007.999999”utc,mysql表示“yyyy-mm-DDHH3333”

TIME

范围:以“hh:mm:ss[.fraction]”格式显示“-838:59:59.000000”到“838:59:59.000000”,并生成字符串

TIME类型不仅可用于表示一天中的某个时间,还可用于表示经过的时间或两个事件之间的时间间隔。 有时会远远超过24小时,甚至是负的。

YEAR

2位或4位格式的年份。 默认值为4位数字格式。 year(2)或year(2)的显示格式不同,但取的值范围相同。 在4位格式中,值显示为1901到2155或0000。 在2位格式中,值显示为2069。 这意味着,在1970年到2069年的MySQL中,YEAR的格式为YYYY或yyy

有关时区:

MySQL将TIMESTAMP值从当前时区转换为UTC并存储,然后从UTC转换为当前时区进行检索。 (对于其他类型,如DATETIME。 不会发生那样的事。 缺省情况下,每个连接的当前时区是服务器时间。 可以为每个连接设置时区。 除非更改时区设置,否则将获得与存储相同的值。 如果保存TIMESTAMP值并更改时区以获取值,则获取的值与保存的值不同。 发生这种情况的原因是,没有在两个方向上使用同一时区进行转换。 当前时区可用作time_zone系统变量。

在官方网站https://dev.MySQL.com/doc/ref man/5.6/en/time-zone-support.html上又作了说明:

会话的时区设置会影响对时区敏感的时间值的显示和保存。 这包括NOW (由和等功能显示的值CURTIME )和存储在TIMESTAMP列中并从列中检索的值。TIMESTAMP 列的值从会话时区转换为UTC以进行存储,并从UTC转换为会话时区以进行检

索。

    会话时区设置不会影响功能显示的 UTC_TIMESTAMP()值或者 TIME,DATE,或 DATETIME列中的值。这些数据类型中的值也不会存储在UTC中;时区仅在从TIMESTAMP值转换时适用 。如果要针对DATE, TIME或 DATETIME值进行语言环境特定的算术 ,请将其转换为UTC,执行该算术,然后再转换回去。

测试验证会话时区:

表(_id, uid_pk, regist_time, time)// regist_time:DATETIME;time:TIMESTAMP//查看全局时区和会话时区SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;@@GLOBAL.time_zone @@SESSION.time_zone+08:00 +08:00insert into user(_id, uid_pk, regist_time, time) VALUES("3","3","2021-03-01 15:31:45", "2021-03-01 15:31:45"); //两者在表中存储时间都为"2021-03-01 15:31:45"//设置会话时区set time_zone = '+0:00';flush privileges;//再次查询时区SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; @@GLOBAL.time_zone @@SESSION.time_zone+08:00 +00:00//再次插入insert into user(_id, uid_pk, regist_time, time) VALUES("4","4","2021-03-01 15:31:45", "2021-03-01 15:31:45"); //这时regist_time还是"2021-03-01 15:31:45",但是time已经变成了"2021-03-01 23:31:45"加了8小时

注:

go-sql-driver 的连接参数:

loc是设置用户服务器时区,并且要与parseTime=true一起使用,即把time.Time的时区改变为指定时区

time_zone才是设置mysql服务器会话时区,比如设为url.QueryEscape("+8:00"),详情见:https://github.com/go-sql-driver/mysql#system-variables

 

3.pg

pg表达时间的有:timestamp without time zone, timestamp with time zone, date, time without time zone, time with time zone, interval. 

除了date以外的都可以设置最多6位精度。

 

4.sqlite3

sqlite3虽然声明可以有datetime/timestamp/date,但是都会存储为UTC时间且包含日期和时间。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。