@@ -349,10 +349,9 @@ func (d DbqDataValidatorImpl) convertToFloat64(value interface{}) (float64, erro
349349 case uint64 :
350350 return float64 (v ), nil
351351 case string :
352- return strconv . ParseFloat ( v , 64 )
352+ return d . tryParseTimeDurationOrFloat ( v )
353353 case []byte :
354- // Handle byte arrays from PostgreSQL/MySQL drivers
355- return strconv .ParseFloat (string (v ), 64 )
354+ return d .tryParseTimeDurationOrFloat (string (v ))
356355 default :
357356 return 0 , fmt .Errorf ("unsupported type: %T" , value )
358357 }
@@ -388,9 +387,38 @@ func (d DbqDataValidatorImpl) convertToInt(value interface{}) (int, error) {
388387 case string :
389388 return strconv .Atoi (v )
390389 case []byte :
391- // Handle byte arrays from PostgreSQL/MySQL drivers
392390 return strconv .Atoi (string (v ))
393391 default :
394392 return 0 , fmt .Errorf ("unsupported type: %T" , value )
395393 }
396394}
395+
396+ // tryParseTimeDurationOrFloat parses time duration strings like "3d", "1h", "30m", "45s" into seconds or fallbacks to plain float parsing
397+ func (d DbqDataValidatorImpl ) tryParseTimeDurationOrFloat (duration string ) (float64 , error ) {
398+ if len (duration ) < 2 {
399+ return strconv .ParseFloat (duration , 64 ) // Fallback to regular number parsing
400+ }
401+
402+ // number and unit
403+ numStr := duration [:len (duration )- 1 ]
404+ unit := duration [len (duration )- 1 :]
405+
406+ num , err := strconv .ParseFloat (numStr , 64 )
407+ if err != nil {
408+ return strconv .ParseFloat (duration , 64 ) // Fallback to regular number parsing
409+ }
410+
411+ switch unit {
412+ case "s" : // seconds
413+ return num , nil
414+ case "m" : // minutes
415+ return num * 60 , nil
416+ case "h" : // hours
417+ return num * 3600 , nil
418+ case "d" : // days
419+ return num * 86400 , nil // 24 * 60 * 60
420+ default :
421+ // unit is not recognized, fallback to regular number parsing
422+ return strconv .ParseFloat (duration , 64 )
423+ }
424+ }
0 commit comments