Added Coalesce and TimestampDiff expression
This commit is contained in:
parent
a4919ae554
commit
56a148b316
@ -308,6 +308,135 @@ func (db *DB) GroupConcat(e *expr, separator string, orderExpr *expr) string {
|
|||||||
return db.GroupConcatExpr(e, separator, orderExpr).expr
|
return db.GroupConcatExpr(e, separator, orderExpr).expr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TimeUnit int
|
||||||
|
|
||||||
|
var (
|
||||||
|
TimeUnitYear TimeUnit = 0
|
||||||
|
TimeUnitQuarter TimeUnit = 1
|
||||||
|
TimeUnitMonth TimeUnit = 2
|
||||||
|
TimeUnitDay TimeUnit = 3
|
||||||
|
TimeUnitWeek TimeUnit = 4
|
||||||
|
TimeUnitHour TimeUnit = 5
|
||||||
|
TimeUnitMinute TimeUnit = 6
|
||||||
|
TimeUnitSecond TimeUnit = 7
|
||||||
|
TimeUnitMicrosecond TimeUnit = 8
|
||||||
|
)
|
||||||
|
|
||||||
|
func (t TimeUnit) String(dialect string) string {
|
||||||
|
switch dialect {
|
||||||
|
case "mysql":
|
||||||
|
switch t {
|
||||||
|
case TimeUnitYear:
|
||||||
|
return "YEAR"
|
||||||
|
case TimeUnitQuarter:
|
||||||
|
return "QUARTER"
|
||||||
|
case TimeUnitMonth:
|
||||||
|
return "MONTH"
|
||||||
|
case TimeUnitDay:
|
||||||
|
return "WEEK"
|
||||||
|
case TimeUnitWeek:
|
||||||
|
return "DAY"
|
||||||
|
case TimeUnitHour:
|
||||||
|
return "HOUR"
|
||||||
|
case TimeUnitMinute:
|
||||||
|
return "MINUTE"
|
||||||
|
case TimeUnitSecond:
|
||||||
|
return "SECOND"
|
||||||
|
case TimeUnitMicrosecond:
|
||||||
|
return "MICROSECOND"
|
||||||
|
}
|
||||||
|
case "mssql":
|
||||||
|
switch t {
|
||||||
|
case TimeUnitYear:
|
||||||
|
return "year"
|
||||||
|
case TimeUnitQuarter:
|
||||||
|
return "quarter"
|
||||||
|
case TimeUnitMonth:
|
||||||
|
return "month"
|
||||||
|
case TimeUnitDay:
|
||||||
|
return "day"
|
||||||
|
case TimeUnitWeek:
|
||||||
|
return "week"
|
||||||
|
case TimeUnitHour:
|
||||||
|
return "hour"
|
||||||
|
case TimeUnitMinute:
|
||||||
|
return "minute"
|
||||||
|
case TimeUnitSecond:
|
||||||
|
return "second"
|
||||||
|
case TimeUnitMicrosecond:
|
||||||
|
return "microsecond"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "unkown time unit"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) TimestampDiffExpr(unit TimeUnit, timestamp1 interface{}, timestamp2 interface{}) *expr {
|
||||||
|
e := &expr{expr: ""}
|
||||||
|
|
||||||
|
dialect := db.Dialect().GetName()
|
||||||
|
switch dialect {
|
||||||
|
case "mysql":
|
||||||
|
e.expr = "TIMESTAMPDIFF("
|
||||||
|
case "mssql":
|
||||||
|
e.expr = "DATEDIFF("
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("TIMESTAMPDIFF not supported for %s", dialect))
|
||||||
|
|
||||||
|
}
|
||||||
|
e.expr += unit.String(dialect) + ","
|
||||||
|
|
||||||
|
if exp, ok := timestamp1.(*expr); ok {
|
||||||
|
e.expr += exp.expr
|
||||||
|
e.args = append(e.args, exp.args...)
|
||||||
|
} else {
|
||||||
|
e.expr += "?"
|
||||||
|
e.args = append(e.args, timestamp1)
|
||||||
|
}
|
||||||
|
|
||||||
|
e.expr += ","
|
||||||
|
|
||||||
|
if exp, ok := timestamp2.(*expr); ok {
|
||||||
|
e.expr += exp.expr
|
||||||
|
e.args = append(e.args, exp.args...)
|
||||||
|
} else {
|
||||||
|
e.expr += "?"
|
||||||
|
e.args = append(e.args, timestamp2)
|
||||||
|
}
|
||||||
|
|
||||||
|
e.expr += ")"
|
||||||
|
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) TimestampDiff(unit TimeUnit, timestamp1 interface{}, timestamp2 interface{}) string {
|
||||||
|
return db.TimestampDiffExpr(unit, timestamp1, timestamp2).expr
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) CoalesceExpr(stmts ...interface{}) *expr {
|
||||||
|
e := &expr{expr: "COALESCE("}
|
||||||
|
|
||||||
|
for i, stmt := range stmts {
|
||||||
|
if i != 0 {
|
||||||
|
e.expr += ", "
|
||||||
|
}
|
||||||
|
|
||||||
|
if exp, ok := stmt.(*expr); ok {
|
||||||
|
e.expr += exp.expr
|
||||||
|
e.args = append(e.args, exp.args...)
|
||||||
|
} else {
|
||||||
|
e.expr += "?"
|
||||||
|
e.args = append(e.args, stmt)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
e.expr += ")"
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
func (db *DB) Coalesce(stmts ...interface{}) string {
|
||||||
|
return db.CoalesceExpr(stmts...).expr
|
||||||
|
}
|
||||||
|
|
||||||
func Order(stmts ...interface{}) *expr {
|
func Order(stmts ...interface{}) *expr {
|
||||||
e := &expr{expr: "ORDER BY "}
|
e := &expr{expr: "ORDER BY "}
|
||||||
for i, stmt := range stmts {
|
for i, stmt := range stmts {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user