t1, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 10:00:00", time.Local)
t2, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-10-27 11:00:00", time.Local)
db.Model("user").Ctx(ctx).Where("create_time>? and create_time<?", t1, t2).One()
// SELECT * FROM `user` WHERE create_time>'2020-10-27 10:00:00' AND create_time<'2020-10-27 11:00:00'
8 Comments
sanrentai
在sqlserver中,如果字段类型是 datetime时,在查询后获取的时间是utc时区的。 可以设置字段类型为 datetime2,这样可以获取的本地时区的时间,这样就可以直接比较时间了
DYL
请问我需要手动指定新插入数据的created_at和updated_at,这个需要怎么做到呢?我需要用代码导入另外一张表的记录,但是created_at和updated_at字段我想要按原值来进行插入
郭强
写入或者更新数据的时候指定
created_at
和updated_at
,那么ORM不会自动生成时间,而是使用开发者提交的时间。forget
设置了时区,只要用命令生成了dao的表,保存时间都会自动变成UTC时间,哪怕存字符串用db.Model().Insert()也一样,新建的没有dao的表就没有这问题
wln32
代码是什么啊,发来看看
forget
已解决,字段名触发时间维护了
keepeye
pgsql的时区很奇怪啊,配置中设置的时区是UTC,字段类型是timestamptz,查询没问题,显示的是utc时间。
但是orm插入时间值会被当成+8时区转换成UTC,但我看debug打印出来的sql语句,时间字符串也没带时区信息啊,理论上数据库应该直接把它当成UTC才对啊。
框架debug日志:
···
INSERT INTO "user"("username","nickname","password","created_at") VALUES('tttttttt','ttttttt','123456','2024-08-20 21:14:41')
/* timezone: "UTC" 2024-08-20 21:14:41 入库应该直接就是UTC时间吧,实际到数据库中时间就变成 2024-08-20 13:14:41.621856+00 */
···
是不是
*gtime.Time
对象实际发送到数据库时带有时区信息?日志这边显示的sql语句不是最终执行的?keepeye
哎自己搞明白了,打印sql语句是通过 FormatSqlWithArgs 方法实现的,这里面时间格式是手动设置的 `t.Format(`2006-01-02 15:04:05`)` ,而最终执行sql是传的 time.Time对象给标准库 database/sql ,最终time.Time.String() 方法是带时区信息的