diff --git a/base_test.go b/base_test.go index 365fd240..6f12abc8 100644 --- a/base_test.go +++ b/base_test.go @@ -1045,6 +1045,12 @@ func testColTypes(engine *Engine, t *testing.T) { } // don't use this type as query condition + var tt time.Time + newAc.Date = tt + newAc.DateTime = tt + //newAc.Time = tt + //newAc.TimeStamp = tt + newAc.Real = 0 newAc.Float = 0 newAc.Double = 0 @@ -1054,7 +1060,7 @@ func testColTypes(engine *Engine, t *testing.T) { panic(err) } if cnt != 1 { - err = errors.New("delete error") + err = errors.New(fmt.Sprintf("delete error, deleted counts is %v", cnt)) t.Error(err) panic(err) } diff --git a/session.go b/session.go index 9784c3b1..809b769d 100644 --- a/session.go +++ b/session.go @@ -1169,7 +1169,7 @@ func row2map(rows *sql.Rows, fields []string) (resultsMap map[string][]byte, err //时间类型 case reflect.Struct: if aa.String() == "time.Time" { - str = rawValue.Interface().(time.Time).Format("2006-01-02 15:04:05.000000 -0700") + str = rawValue.Interface().(time.Time).Format(time.RFC3339Nano) result[key] = []byte(str) } else { return nil, errors.New(fmt.Sprintf("Unsupported struct type %v", vv.Type().Name())) @@ -1499,6 +1499,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data sdata := string(data) var x int64 var err error + // for mysql, when use bit, it returned \x01 if col.SQLType.Name == Bit && strings.Contains(session.Engine.DriverName, "mysql") { if len(data) == 1 { @@ -1506,7 +1507,7 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data } else { x = 0 } - fmt.Println("######", x, data) + //fmt.Println("######", x, data) } else if strings.HasPrefix(sdata, "0x") { x, err = strconv.ParseInt(sdata, 16, 64) } else if strings.HasPrefix(sdata, "0") { @@ -1536,8 +1537,14 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data sdata := string(data) var x time.Time var err error - if len(sdata) > 19 { - x, err = time.Parse("2006-01-02 15:04:05.000000 -0700", sdata) + // time stamp + if !strings.ContainsAny(sdata, "- :") { + sd, err := strconv.ParseInt(sdata, 10, 64) + if err == nil { + x = time.Unix(0, sd) + } + } else if len(sdata) > 19 { + x, err = time.Parse(time.RFC3339Nano, sdata) } else if len(sdata) == 19 { x, err = time.Parse("2006-01-02 15:04:05", sdata) } else if len(sdata) == 10 && sdata[4] == '-' && sdata[7] == '-' { @@ -1546,8 +1553,10 @@ func (session *Session) bytes2Value(col *Column, fieldValue *reflect.Value, data if len(sdata) > 8 { sdata = sdata[len(sdata)-8:] } - st := "2012-03-04 " + sdata + st := fmt.Sprintf("2006-01-02 %v", sdata) x, err = time.Parse("2006-01-02 15:04:05", st) + } else { + return errors.New(fmt.Sprintf("unsupported time format %v", string(data))) } if err != nil { return errors.New(fmt.Sprintf("unsupported time format %v: %v", string(data), err)) @@ -1614,14 +1623,12 @@ func (session *Session) value2Interface(col *Column, fieldValue reflect.Value) ( case reflect.Struct: if fieldValue.Type().String() == "time.Time" { if col.SQLType.Name == Time { - return fieldValue.Interface().(time.Time).Format("2006-01-02 15:04:05"), nil + //s := fieldValue.Interface().(time.Time).Format("2006-01-02 15:04:05 -0700") + s := fieldValue.Interface().(time.Time).Format(time.RFC3339) + return s[11:19], nil } else if col.SQLType.Name == Date { return fieldValue.Interface().(time.Time).Format("2006-01-02"), nil } - // crying... - if session.Engine.DriverName == POSTGRES { - return fieldValue.Interface().(time.Time).Format("2006-01-02 15:04:05.000000 -0700"), nil - } return fieldValue.Interface(), nil } if fieldTable, ok := session.Engine.Tables[fieldValue.Type()]; ok { diff --git a/statement.go b/statement.go index c91dc8c6..96841078 100644 --- a/statement.go +++ b/statement.go @@ -157,13 +157,14 @@ func buildConditions(engine *Engine, table *Table, bean interface{}, includeVers } var str string if col.SQLType.Name == Time { - str = strings.Split(t.Format("2006-01-02 15:04:05"), " ")[1] + s := t.UTC().Format("2006-01-02 15:04:05") + val = s[11:19] } else if col.SQLType.Name == Date { str = t.Format("2006-01-02") + val = str } else { - str = t.Format("2006-01-02 15:04:05.000000 -0700") + val = t } - val = str } else { engine.AutoMapType(fieldValue.Type()) if table, ok := engine.Tables[fieldValue.Type()]; ok {