func dumpBinaryDateTime(t mysql.Time, loc *time.Location) (data []byte) { if t.Type == mysql.TypeTimestamp && loc != nil { t.Time = t.In(loc) } year, mon, day := t.Year(), t.Month(), t.Day() if t.IsZero() { year, mon, day = 1, time.January, 1 } switch t.Type { case mysql.TypeTimestamp, mysql.TypeDatetime: data = append(data, 11) data = append(data, dumpUint16(uint16(year))...) data = append(data, byte(mon), byte(day), byte(t.Hour()), byte(t.Minute()), byte(t.Second())) data = append(data, dumpUint32(uint32((t.Nanosecond() / 1000)))...) case mysql.TypeDate, mysql.TypeNewDate: data = append(data, 4) data = append(data, dumpUint16(uint16(year))...) //year data = append(data, byte(mon), byte(day)) } return }
func extractTime(unit string, t mysql.Time) (int64, error) { switch strings.ToUpper(unit) { case "MICROSECOND": return int64(t.Nanosecond() / 1000), nil case "SECOND": return int64(t.Second()), nil case "MINUTE": return int64(t.Minute()), nil case "HOUR": return int64(t.Hour()), nil case "DAY": return int64(t.Day()), nil case "WEEK": _, week := t.ISOWeek() return int64(week), nil case "MONTH": return int64(t.Month()), nil case "QUARTER": m := int64(t.Month()) // 1 - 3 -> 1 // 4 - 6 -> 2 // 7 - 9 -> 3 // 10 - 12 -> 4 return (m + 2) / 3, nil case "YEAR": return int64(t.Year()), nil case "SECOND_MICROSECOND": return int64(t.Second())*1000000 + int64(t.Nanosecond())/1000, nil case "MINUTE_MICROSECOND": _, m, s := t.Clock() return int64(m)*100000000 + int64(s)*1000000 + int64(t.Nanosecond())/1000, nil case "MINUTE_SECOND": _, m, s := t.Clock() return int64(m*100 + s), nil case "HOUR_MICROSECOND": h, m, s := t.Clock() return int64(h)*10000000000 + int64(m)*100000000 + int64(s)*1000000 + int64(t.Nanosecond())/1000, nil case "HOUR_SECOND": h, m, s := t.Clock() return int64(h)*10000 + int64(m)*100 + int64(s), nil case "HOUR_MINUTE": h, m, _ := t.Clock() return int64(h)*100 + int64(m), nil case "DAY_MICROSECOND": h, m, s := t.Clock() d := t.Day() return int64(d*1000000+h*10000+m*100+s)*1000000 + int64(t.Nanosecond())/1000, nil case "DAY_SECOND": h, m, s := t.Clock() d := t.Day() return int64(d)*1000000 + int64(h)*10000 + int64(m)*100 + int64(s), nil case "DAY_MINUTE": h, m, _ := t.Clock() d := t.Day() return int64(d)*10000 + int64(h)*100 + int64(m), nil case "DAY_HOUR": h, _, _ := t.Clock() d := t.Day() return int64(d)*100 + int64(h), nil case "YEAR_MONTH": y, m, _ := t.Date() return int64(y)*100 + int64(m), nil default: return 0, errors.Errorf("invalid unit %s", unit) } }