github.com/matrixorigin/matrixone@v0.7.0/pkg/sql/plan/function/builtin/multi/timestampdiff_test.go (about) 1 // Copyright 2022 Matrix Origin 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package multi 16 17 import ( 18 "testing" 19 20 "github.com/matrixorigin/matrixone/pkg/common/mpool" 21 "github.com/matrixorigin/matrixone/pkg/container/types" 22 "github.com/matrixorigin/matrixone/pkg/container/vector" 23 "github.com/matrixorigin/matrixone/pkg/testutil" 24 "github.com/matrixorigin/matrixone/pkg/vm/process" 25 "github.com/stretchr/testify/require" 26 ) 27 28 func TestDateDiff(t *testing.T) { 29 cases := []struct { 30 name string 31 vecs []*vector.Vector 32 proc *process.Process 33 want int64 34 }{ 35 { 36 name: "TEST01", 37 vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "microsecond", proc.Mp()), 38 proc: testutil.NewProc(), 39 want: 2660588000000, 40 }, 41 { 42 name: "TEST02", 43 vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "second", proc.Mp()), 44 proc: testutil.NewProc(), 45 want: 2660588, 46 }, 47 { 48 name: "TEST03", 49 vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "minute", proc.Mp()), 50 proc: testutil.NewProc(), 51 want: 44343, 52 }, 53 { 54 name: "TEST04", 55 vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "hour", proc.Mp()), 56 proc: testutil.NewProc(), 57 want: 739, 58 }, 59 { 60 name: "TEST05", 61 vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "day", proc.Mp()), 62 proc: testutil.NewProc(), 63 want: 30, 64 }, 65 { 66 name: "TEST06", 67 vecs: makeTimeStampDiffVectors("2017-12-01 12:15:12", "2018-01-08 12:15:12", "week", proc.Mp()), 68 proc: testutil.NewProc(), 69 want: 5, 70 }, 71 { 72 name: "TEST07", 73 vecs: makeTimeStampDiffVectors("2017-11-01 12:15:12", "2018-01-01 12:15:12", "month", proc.Mp()), 74 proc: testutil.NewProc(), 75 want: 2, 76 }, 77 { 78 name: "TEST08", 79 vecs: makeTimeStampDiffVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "quarter", proc.Mp()), 80 proc: testutil.NewProc(), 81 want: 4, 82 }, 83 { 84 name: "TEST09", 85 vecs: makeTimeStampDiffVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "year", proc.Mp()), 86 proc: testutil.NewProc(), 87 want: 1, 88 }, 89 { 90 name: "TEST10", 91 vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "microsecond", proc.Mp()), 92 proc: testutil.NewProc(), 93 want: -2660588000000, 94 }, 95 { 96 name: "TEST11", 97 vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "second", proc.Mp()), 98 proc: testutil.NewProc(), 99 want: -2660588, 100 }, 101 { 102 name: "TEST12", 103 vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "minute", proc.Mp()), 104 proc: testutil.NewProc(), 105 want: -44343, 106 }, 107 { 108 name: "TEST13", 109 vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "hour", proc.Mp()), 110 proc: testutil.NewProc(), 111 want: -739, 112 }, 113 { 114 name: "TEST14", 115 vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-01 7:18:20", "day", proc.Mp()), 116 proc: testutil.NewProc(), 117 want: -30, 118 }, 119 { 120 name: "TEST15", 121 vecs: makeTimeStampDiffReverseVectors("2017-12-01 12:15:12", "2018-01-08 12:15:12", "week", proc.Mp()), 122 proc: testutil.NewProc(), 123 want: -5, 124 }, 125 { 126 name: "TEST16", 127 vecs: makeTimeStampDiffReverseVectors("2017-11-01 12:15:12", "2018-01-01 12:15:12", "month", proc.Mp()), 128 proc: testutil.NewProc(), 129 want: -2, 130 }, 131 { 132 name: "TEST17", 133 vecs: makeTimeStampDiffReverseVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "quarter", proc.Mp()), 134 proc: testutil.NewProc(), 135 want: -4, 136 }, 137 { 138 name: "TEST18", 139 vecs: makeTimeStampDiffReverseVectors("2017-01-01 12:15:12", "2018-01-01 12:15:12", "year", proc.Mp()), 140 proc: testutil.NewProc(), 141 want: -1, 142 }, 143 } 144 145 for _, c := range cases { 146 t.Run(c.name, func(t *testing.T) { 147 date, err := TimeStampDiff(c.vecs, c.proc) 148 if err != nil { 149 t.Fatal(err) 150 } 151 require.Equal(t, c.want, date.Col.([]int64)[0]) 152 }) 153 } 154 } 155 156 func makeTimeStampDiffVectors(firstStr, secondStr, unit string, mp *mpool.MPool) []*vector.Vector { 157 vec := make([]*vector.Vector, 3) 158 159 firstDate, _ := types.ParseDatetime(firstStr, 0) 160 secondDate, _ := types.ParseDatetime(secondStr, 0) 161 162 vec[1] = vector.NewConstFixed(types.T_datetime.ToType(), 1, firstDate, mp) 163 vec[2] = vector.NewConstFixed(types.T_datetime.ToType(), 1, secondDate, mp) 164 vec[0] = vector.NewConstString(types.T_varchar.ToType(), 1, unit, mp) 165 return vec 166 } 167 168 func makeTimeStampDiffReverseVectors(firstStr, secondStr, unit string, mp *mpool.MPool) []*vector.Vector { 169 vec := make([]*vector.Vector, 3) 170 171 firstDate, _ := types.ParseDatetime(firstStr, 0) 172 secondDate, _ := types.ParseDatetime(secondStr, 0) 173 174 vec[1] = vector.NewConstFixed(types.T_datetime.ToType(), 1, secondDate, mp) 175 vec[2] = vector.NewConstFixed(types.T_datetime.ToType(), 1, firstDate, mp) 176 vec[0] = vector.NewConstString(types.T_varchar.ToType(), 1, unit, mp) 177 return vec 178 }