Golang Sql-MySQL - DATE / DATETIME年份0001

时间:2018-01-25 00:47:50

标签: go

我正在使用go-sql-driver / mysql库从MySQL实例中提取数据,并且遇到任何DATE / DATETIME未正确扫描该字段的问题,特别是月份和时间。日期是正确的,但YEAR和TIME的年份始终为0001,时间为00:00:00。

正确拉出所有其他字段。有问题的2个字段是date_added(DATE)和date_timestamp(DATETIME)

任何帮助将不胜感激我已经在这一段时间旋转

示例:

0001-01-01 00:00:00 +0000 UTC

我添加了parseTime = true连接参数也没有运气。

连接字符串:

mysql, err := sql.Open("mysql", "username:password@tcp(10.37.42.1:3306)/mydb?parseTime=true")

查询:

var (
    id              int
    result_id       int
    status          string
    product         string
    serial          string
    station         string
    stage           string
    operator        string
    operator_name   string
    failstep        string
    sequence_rev    int
    date_added      time.Time
    date_timestamp  time.Time
    stage_order     int
    is_retest       int
    extra1          string
    extra2          string
    extra3          string
    extra4          string
    extra5          string
    workorder       string
    segment         string
    retest_reason   string
    wo_qty          int
)

queryString := `
    SELECT d.id, d.result_id, status.status AS status, parent.product AS product, parent.serial AS serial, station.station AS station, stage.description AS stage, u.username AS operator, CONCAT(u.first_name, ' ', u.last_name) AS operator_name, d.failstep, 
    d.sequence_rev, d.date_added, d.date_timestamp, d.stage_order, d.is_retest, 
    d.extra1, d.extra2, d.extra3, d.extra4, d.extra5, d.workorder, parent.segment, d.retest_reason, parent.wo_qty 
    FROM test_result_detail d 
    LEFT JOIN test_result parent ON d.result_id=parent.id
    LEFT JOIN test_result_status status ON d.status_id=status.id
    LEFT JOIN seq_test_stage stage ON d.stage_id=stage.id
    LEFT JOIN seq_test_set station ON d.station_id=station.id
    LEFT JOIN auth_user u ON d.operator_id=u.id
    WHERE d.id > ? and d.date_added >= '2016-01-01'
    LIMIT 5`

    rows, err := mysql.Query(queryString, LastDetailResult.LastID)
    if err != nil {
        panic(err.Error()) // proper error handling instead of panic in your app
    }


    // iterate through the rows
    for rows.Next() {
        fmt.Println(rows.Columns())
        err := rows.Scan(&id, &result_id, &status, &product, &serial, &station, &stage, &operator, &operator_name, &failstep, &sequence_rev, &date_added, &date_timestamp, &stage_order, &is_retest, &extra1, &extra2, &extra3, &extra4, &extra5, &workorder, &segment, &retest_reason, &wo_qty)
        if err != nil {
            //fmt.Println(err)
        }

        // find parent record in Mongo
        var Parent ResultDetail
        var emptyParent ResultDetail
        Session.DB("opt").C("serials").Find(bson.M{"serial": serial}).One(&Parent)

        // if parent cannot be found omit the insert
        if Parent == emptyParent {
            fmt.Println("NO PARENT RECORD")
            continue
        }

        // check mongo to see if this is a duplicate record, if so omit
        var Duplicates []ResultDetail
        Session.DB("opt").C("serial_history").Find(bson.M{"parent": Parent.ID}).All(&Duplicates)

        // TODO check for first_pass vs retry
        if Duplicates != nil {
            // is this a detail record, if so omit
            // if not a duplicate but is an additional pass then flag FirstPass = false
            //fmt.Println(Duplicates)
            fmt.Println("Found Duplicates")
        }

        // detail record data cleanup

        // insert into detailed test result collection
        // d := Session.DB("opt").C("serial_history")
        // i := bson.NewObjectId()
        //insertError := d.Insert(&ResultDetail{ID: i, Operator: operator, Station: station, Serial: serial, Extra1: extra1, Extra2: extra2, Extra3: extra3, Extra4: extra4, Extra5: extra5, LegacyID: id, FirstPass: true, Workorder: workorder, Status: status, Product: product, Parent: Parent.ID, FailStep: failstep, WoQTY: wo_qty, DateTimestamp: date_timestamp, Segment: segment, Stage: stage, OperatorName: operator_name, Order: stage_order, Date: date_added})


        fmt.Println(date_timestamp)

    }

1 个答案:

答案 0 :(得分:0)

我弄清楚发生了什么,我的var声明sequence_rev中的字段给出了一个错误:

  

错误:sql:列索引10上的扫描错误:转换driver.Value   键入(“”)到int:语法无效。

这是因为该字段不是必需的并且可以为空。我将我的var声明从 int 更新为 * int ,这修复了下游的日期问题。

sequence_rev * int