jackc/pgx · error

bad interval format

Error message

bad interval format

What it means

Parsing the interval text failed because the scalar preceding a unit keyword (e.g. before 'year', 'mon', 'day') is not a valid integer. strconv.ParseInt rejected parts[i]; the malformed interval string is the faulting input.

Solutions

  1. Fix the interval literal to PostgreSQL syntax like '1 year 2 mons 3 days 04:05:06'
  2. Let PostgreSQL or pgtype produce the interval text rather than building it ad hoc
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at pgtype/interval.go:214 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of jackc/pgx@ec1a0befd2 (2026-08-04). Data as JSON: /api/errors/f30ec0e10e9c70bb. Report an issue: GitHub.

Appendix: source

Thrown at pgtype/interval.go:214

type scanPlanTextAnyToIntervalScanner struct{}

func (scanPlanTextAnyToIntervalScanner) Scan(src []byte, dst any) error {
	scanner := (dst).(IntervalScanner)

	if src == nil {
		return scanner.ScanInterval(Interval{})
	}

	var microseconds int64
	var days int32
	var months int32

	parts := strings.Split(string(src), " ")

	for i := 0; i < len(parts)-1; i += 2 {
		scalar, err := strconv.ParseInt(parts[i], 10, 64)
		if err != nil {
			return fmt.Errorf("bad interval format")
		}

		switch parts[i+1] {
		case "year", "years":
			months += int32(scalar * 12)
		case "mon", "mons":
			months += int32(scalar)
		case "day", "days":
			days = int32(scalar)
		default:
			return fmt.Errorf("bad interval format: %q", parts[i+1])
		}
	}

	if len(parts)%2 == 1 {
		timeParts := strings.SplitN(parts[len(parts)-1], ":", 3)
		if len(timeParts) != 3 {
			return fmt.Errorf("bad interval format")

View on GitHub (pinned to ec1a0befd2)