jackc/pgx · error

bad interval format

Error message

bad interval format: %q

What it means

The interval text contains a number followed by a unit that is not one of the accepted keywords (year/years/mon/mons/day/days). The unrecognized unit token, shown quoted in the message, is the faulting input.

Solutions

  1. Use only supported units: years, months (mons), days, and an HH:MM:SS time part
  2. Avoid locale-specific or abbreviated units not emitted by PostgreSQL
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at pgtype/interval.go:225 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/a2cde4869d4faa30. Report an issue: GitHub.

Appendix: source

Thrown at pgtype/interval.go:225

	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")
		}

		var negative bool
		if len(timeParts[0]) > 0 && timeParts[0][0] == '-' {
			negative = true
			timeParts[0] = timeParts[0][1:]
		}

		hours, err := strconv.ParseInt(timeParts[0], 10, 64)
		if err != nil {
			return fmt.Errorf("bad interval hour format: %s", timeParts[0])

View on GitHub (pinned to ec1a0befd2)