【问题标题】:How to get timestamp value out of Postgresql without time zone?如何在没有时区的情况下从 Postgresql 中获取时间戳值?
【发布时间】:2018-09-16 09:48:18
【问题描述】:

我有一张包含timestamp TIMESTAMPdata TEXT 列的表格。我有一个失败的测试,因为我无法在没有时区注释的情况下从 postgresql 中获取时间戳值。这是我在 Go 应用程序中所做工作的精简版:

type Datapoint struct {
    Timestamp  string
    Data       sql.NullString
}
var testData = Datapoint{Timestamp:'2018-12-31 00:00:00', Data:'test'}

db.Exec("CREATE TABLE mytable (id SERIAL, timestamp TIMESTAMP, data TEXT);")
db.Exec("INSERT INTO mytable(timestamp, data) VALUES ($1, $2);", testData.Timestamp, testData.Data)
datapoints, err = db.Exec("SELECT timestamp::TIMESTAMP WITHOUT TIME ZONE, data FROM mytable;")

这个问题是这个查询(经过大约 20 行错误检查和row.Scan;golang 有点像那样冗长......)给了我:

预计 2018-12-31 00:00:00,收到 2018-12-31T00:00:00Z

我在没有时区的情况下请求(并且在 psql 中查询成功),那么为什么我在字符串中得到额外的 T 和 Z?

【问题讨论】:

  • 如果你扫描成一个字符串,格式化是由 SQL 包决定的。如果您需要特定格式,请改用 time.Time 并调用 Format。
  • 不相关,但timestamp::TIMESTAMP WITHOUT TIME ZONE不需要演员表,timestampTIMESTAMP WITHOUT TIME ZONE本身
  • @Peter 谢谢,那是正确的。我不得不time.Parse(time.RFC3339, timestamp)(这对于大型查询来说有点痛苦......)。如果您想将其作为答案,我会接受。
  • 可以直接扫描成time.Time值,无需自己解析。看我的回答。

标签: postgresql go


【解决方案1】:

扫描成time.Time的值而不是字符串,然后您可以根据需要格式化时间。

package main

import (
    "database/sql"
    "fmt"
    "log"
    "time"
)

type Datapoint struct {
    Timestamp time.Time
    Data      sql.NullString
}

func main() {
    var db *sql.DB

    var dp Datapoint    
    err := db.QueryRow("SELECT timestamp, data FROM mytable").Scan(
        &dp.Timestamp, &dp.Data,
    )

    switch {
    case err == sql.ErrNoRows:
        log.Fatal("No rows")
    case err != nil:
        log.Fatal(err)
    default:
        fmt.Println(dp.Timestamp.Format("2006-01-02 15:04:05"))
    }

}

【讨论】:

    【解决方案2】:

    您收到的是时间的 ISO 8601 表示。

    T 是表示的时间分量之前的时间指示符。

    Z 用于表示是UTC时间,Z表示零偏移。

    在某种程度上,你得到的东西没有时区,但它可能会令人困惑,特别是因为你没有在任何时候本地化你的时间。我建议您考虑使用 ISO 时间,或者您可以将时间转换为这样的字符串

    s := fmt.Sprintf("%d-%02d-%02d %02d:%02d:%02d\n",
        t.Year(), t.Month(), t.Day(),
        t.Hour(), t.Minute(), t.Second())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2014-12-23
      • 2017-09-02
      • 2020-04-09
      • 1970-01-01
      相关资源
      最近更新 更多