diff --git a/internal/statements/args.go b/internal/statements/args.go index 727d5977..ce11dba0 100644 --- a/internal/statements/args.go +++ b/internal/statements/args.go @@ -5,10 +5,23 @@ package statements import ( + "database/sql/driver" + "fmt" + "xorm.io/builder" "xorm.io/xorm/schemas" ) +type DateTimeString struct { + Layout string + Str string +} + +// Value implements the driver Valuer interface. +func (n DateTimeString) Value() (driver.Value, error) { + return n.Str, nil +} + // WriteArg writes an arg func (statement *Statement) WriteArg(w *builder.BytesWriter, arg interface{}) error { switch argv := arg.(type) { @@ -22,6 +35,17 @@ func (statement *Statement) WriteArg(w *builder.BytesWriter, arg interface{}) er if _, err := w.WriteString(")"); err != nil { return err } + case *DateTimeString: + if statement.dialect.URI().DBType == schemas.ORACLE { + if _, err := fmt.Fprintf(w, `TO_DATE(?,'%s')`, argv.Layout); err != nil { + return err + } + } else { + if err := w.WriteByte('?'); err != nil { + return err + } + } + w.Append(arg) default: if err := w.WriteByte('?'); err != nil { return err diff --git a/internal/statements/values.go b/internal/statements/values.go index 4c1360ed..f27caedb 100644 --- a/internal/statements/values.go +++ b/internal/statements/values.go @@ -88,7 +88,20 @@ func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue refl if fieldType.ConvertibleTo(schemas.TimeType) { t := fieldValue.Convert(schemas.TimeType).Interface().(time.Time) tf, err := dialects.FormatColumnTime(statement.dialect, statement.defaultTimeZone, col, t) - return tf, err + if val, ok := tf.(string); ok { + var layout string + switch col.SQLType.Name { + case schemas.Date: + layout = "yyyy-MM-dd" + case schemas.Time: + layout = "HH24:mi:ss" + default: + layout = "yyyy-MM-dd HH24:mi:ss" + } + return &DateTimeString{Layout: layout, Str: val}, err + } else { + return tf, err + } } else if fieldType.ConvertibleTo(nullFloatType) { t := fieldValue.Convert(nullFloatType).Interface().(sql.NullFloat64) if !t.Valid {