SELECT WHERE 与 updated_at 是错误的

SELECT WHERE with updated_at is wrong

预期此代码结果是 null 但我得到的不是 null。
rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)

date := "2018-01-04 23:18:00" 并且 Onedays table.

中有一些记录
+----+---------+------------+------------+---------------------+
| id | user_id | save_state | date       | updated_at          |
+----+---------+------------+------------+---------------------+
|  1 |      44 |          0 | 1514214001 | 2018-01-04 21:25:05 |
|  2 |      44 |          0 | 1514214001 | 2018-01-04 22:07:55 |
|  3 |      15 |          1 | 1514300400 | 2018-01-04 23:17:49 |
+----+---------+------------+------------+---------------------+

return其代码为:

{
"onedays": [
    {
        "id": 1,
        "user_id": 44,
        "save_state": false,
        "date": 1514214001,
        "updated_at": "2018-01-04T21:25:05+09:00"
    },
    {
        "id": 2,
        "user_id": 44,
        "save_state": false,
        "date": 1514214001,
        "updated_at": "2018-01-04T22:07:55+09:00"
    }
],
"photos": null
}

但是我执行了这个查询,return 是空的。
SELECT * FROM Onedays WHERE user_id = 44 AND updated_at > '2018-01-04 23:18:00'

这个问题可能是gorm设置引起的。
我该如何解决这个问题?

更新粘贴的函数代码

func getDiff(userID, date string) interface{} {
    var wg sync.WaitGroup

    var onedays []model.OnedayDiff
    var photos []model.PhotoDiff
    var resPhotos []model.PhotoDiff

    _, rDB := lib.DB()
    rDB.Where("user_id = ? AND updated_at > ?", userID, date).Find(&onedays)

    funcs := []func(){
        // Photo
        func() {
            rDB.Where("user_id = ?", userID).Find(&onedays)
            for _, v := range onedays {
                rDB.Where("oneday_id = ? AND updated_at > ?", v.ID, date).Find(&photos)
                resPhotos = append(resPhotos, photos...)
            }
        },
    }
    for _, sleep := range funcs {
        wg.Add(1)

        go func(function func()) {
            defer wg.Done()
            function()
        }(sleep)
    }
    wg.Wait()

    return map[string]interface{}{
        "onedays": onedays,
        "photos":  resPhotos,
    }
}

photos 是正确的。 onedays 不正确...

正如您在从 GORM 获得的响应中看到的那样,update_at 值包含时区(+09:00 部分),而数据库中的值没有,所以这些是要么作为 UTC 处理,要么作为数据库服务器中配置的默认时区处理。

您应该检查数据库和代码所在的主机之间的时区差异 运行。

这里:

func() {
    rDB.Where("user_id = ?", userID).Find(&onedays)
    for _, v := range onedays {
        rDB.Where("oneday_id = ? AND updated_at > ?", v.ID, date).Find(&photos)
        resPhotos = append(resPhotos, photos...)
    }
},

您在第二行中重复使用了切片 onedays,因此它不再是空的。在第 4 行中,您正在异步写入 photos,这会导致数据竞争,并且如果有多个 goroutines 就会搞砸。

您应该在函数中重新声明两个数组:

func() {
    var onedays []model.OnedayDiff
    var photos []model.PhotoDiff
    //other codes
}