@@ -137,3 +137,61 @@ func (s *DatabendTestSuite) TestTimestamp() {
137137 })
138138 }
139139}
140+
141+ func (s * DatabendTestSuite ) TestTimestampTz () {
142+ if semver .Compare (driverVersion , "v0.9.0" ) <= 0 || semver .Compare (serverVersion , "1.2.844" ) < 0 {
143+ return
144+ }
145+
146+ type testCase struct {
147+ name string
148+ // scan should get Time with location in settings
149+ setting * time.Location
150+ data * time.Location
151+ }
152+ locShanghai , _ := time .LoadLocation ("Asia/Shanghai" )
153+ locLos , _ := time .LoadLocation ("America/Los_Angeles" )
154+ input := time .Date (2025 , 1 , 16 , 2 , 1 , 26 , 739219000 , locLos )
155+
156+ testCases := []testCase {
157+ {name : "1" , setting : time .UTC },
158+ {name : "2" , setting : locShanghai },
159+ }
160+
161+ for i , tc := range testCases {
162+ s .Run (tc .name , func () {
163+ db := sql .OpenDB (s .cfg )
164+ defer db .Close ()
165+
166+ tableName := fmt .Sprintf ("test_tz_%s_%d" , s .table , i )
167+ result , err := db .Exec (fmt .Sprintf ("create or replace table %s (t Timestamp_TZ)" , tableName ))
168+ s .r .NoError (err )
169+
170+ result , err = db .Exec (fmt .Sprintf ("set timezone='%v'" , tc .setting .String ()))
171+ s .r .NoError (err )
172+
173+ insertSQL := fmt .Sprintf ("INSERT INTO %s VALUES (?)" , tableName )
174+ result , err = db .Exec (insertSQL , input )
175+ s .r .NoError (err )
176+ n , err := result .RowsAffected ()
177+ s .r .NoError (err )
178+ s .r .Equal (int64 (1 ), n )
179+
180+ selectSQL := fmt .Sprintf ("select * from %s" , tableName )
181+ rows , err := db .Query (selectSQL )
182+ s .r .NoError (err )
183+ s .r .True (rows .Next ())
184+ s .r .NoError (err )
185+
186+ var output time.Time
187+ err = rows .Scan (& output )
188+ s .r .NoError (err )
189+
190+ s .r .Equal (input .UnixMicro (), output .UnixMicro ())
191+ name , offset := output .Zone ()
192+ s .r .Equal (- 8 * 3600 , offset )
193+ s .r .Equal ("" , name )
194+ s .r .NoError (rows .Close ())
195+ })
196+ }
197+ }
0 commit comments