• Start

Languages

/

JavaScript

/

API Reference

/

Data Types

Range

Generic range values for numeric, datetime, and other ordered types.

The Range class provides generic range values for representing inclusive or exclusive ranges of ordered data types.

Import:

import { Range } from 'surrealdb';

Source: value/range.ts

  • Beg - The type of the beginning bound

  • End - The type of the ending bound

Create a new range value.

Syntax

new Range(begin, end)
ParameterTypeDescription
begin Bound<Beg>The beginning bound (can be inclusive or exclusive).
end Bound<End>The ending bound (can be inclusive or exclusive).
// Numeric range [1, 100]
const numericRange = new Range(
{ value: 1, inclusive: true },
{ value: 100, inclusive: true }
);

// Date range
const dateRange = new Range(
{ value: DateTime.parse('2024-01-01'), inclusive: true },
{ value: DateTime.parse('2024-12-31'), inclusive: true }
);

// Half-open range [0, 10)
const halfOpen = new Range(
{ value: 0, inclusive: true },
{ value: 10, inclusive: false }
);

The beginning bound of the range.

Type: Bound<Beg>

const range = new Range(
{ value: 1, inclusive: true },
{ value: 10, inclusive: true }
);

console.log(range.begin.value); // 1
console.log(range.begin.inclusive); // true

The ending bound of the range.

Type: Bound<End>

const range = new Range(
{ value: 1, inclusive: true },
{ value: 10, inclusive: true }
);

console.log(range.end.value); // 10
console.log(range.end.inclusive); // true

Convert to string representation.

Syntax

range.toString()

string - Range string (e.g., 1..10, 1..=10, 1>..10)

// Inclusive range [1, 10]
const inclusive = new Range(
{ value: 1, inclusive: true },
{ value: 10, inclusive: true }
);
console.log(inclusive.toString()); // '1..=10'

// Exclusive range (1, 10)
const exclusive = new Range(
{ value: 1, inclusive: false },
{ value: 10, inclusive: false }
);
console.log(exclusive.toString()); // '1>..10'

// Half-open [1, 10)
const halfOpen = new Range(
{ value: 1, inclusive: true },
{ value: 10, inclusive: false }
);
console.log(halfOpen.toString()); // '1..10'

Serialize for JSON.

Syntax

range.toJSON()

string - Range string representation

Check if two ranges are equal.

Syntax

range.equals(other)

boolean - True if equal

import { Surreal, Range } from 'surrealdb';

const db = new Surreal();
await db.connect('ws://localhost:8000');

// Define age range for filtering
const adultRange = new Range(
{ value: 18, inclusive: true },
{ value: 120, inclusive: true }
);

// Query with range
const adults = await db.query(`
SELECT * FROM users
WHERE age IN $range
`, {
range: adultRange
}).collect();
import { DateTime, Range } from 'surrealdb';

// Define fiscal year
const fiscalYear = new Range(
{ value: DateTime.parse('2024-01-01T00:00:00Z'), inclusive: true },
{ value: DateTime.parse('2024-12-31T23:59:59Z'), inclusive: true }
);

// Query events in date range
const events = await db.query(`
SELECT * FROM events
WHERE date IN $range
`, {
range: fiscalYear
}).collect();
import { Decimal, Range } from 'surrealdb';

// Define price range for product filtering
const budgetRange = new Range(
{ value: new Decimal('0'), inclusive: true },
{ value: new Decimal('100'), inclusive: true }
);

const products = await db.query(`
SELECT * FROM products
WHERE price IN $range
`, {
range: budgetRange
}).collect();
// Grade ranges
const gradeA = new Range(
{ value: 90, inclusive: true },
{ value: 100, inclusive: true }
);

const gradeB = new Range(
{ value: 80, inclusive: true },
{ value: 89, inclusive: true }
);

// Assign grades
const students = await db.query(`
SELECT *,
CASE
WHEN score IN $gradeA THEN 'A'
WHEN score IN $gradeB THEN 'B'
ELSE 'C'
END AS grade
FROM students
`, {
gradeA,
gradeB
}).collect();
// Recent activity (last 30 days)
const now = DateTime.now();
const thirtyDaysAgo = now.minus(Duration.parse('30d'));

const recentRange = new Range(
{ value: thirtyDaysAgo, inclusive: true },
{ value: now, inclusive: true }
);

const recentActivity = await db.query(`
SELECT * FROM activity_log
WHERE timestamp IN $range
ORDER BY timestamp DESC
`, {
range: recentRange
}).collect();
import { RecordId, Range } from 'surrealdb';

// Fetch records in ID range
const idRange = new Range(
{ value: new RecordId('users', 'a'), inclusive: true },
{ value: new RecordId('users', 'f'), inclusive: false }
);

const users = await db.query(`
SELECT * FROM users
WHERE id IN $range
`, {
range: idRange
}).collect();
// Exclusive range (not including boundaries)
const exclusive = new Range(
{ value: 0, inclusive: false },
{ value: 100, inclusive: false }
);
// Matches: 0 < x < 100

const results = await db.query(`
SELECT * FROM measurements
WHERE value IN $range
`, {
range: exclusive
}).collect();
// Half-open range [start, end)
const halfOpen = new Range(
{ value: 0, inclusive: true },
{ value: 10, inclusive: false }
);
// Matches: 0 <= x < 10

// Common for array-like indexing
const items = await db.query(`
SELECT * FROM items
WHERE index IN $range
`, {
range: halfOpen
}).collect();
// Define multiple severity levels
const low = new Range(
{ value: 0, inclusive: true },
{ value: 3, inclusive: true }
);

const medium = new Range(
{ value: 4, inclusive: true },
{ value: 6, inclusive: true }
);

const high = new Range(
{ value: 7, inclusive: true },
{ value: 10, inclusive: true }
);

// Query by severity
const criticalIssues = await db.query(`
SELECT * FROM issues
WHERE severity IN $range
`, {
range: high
}).collect();
function queryByRange<T>(
start: T,
end: T,
inclusive: boolean = true
): Range<T, T> {
return new Range(
{ value: start, inclusive },
{ value: end, inclusive }
);
}

// Usage
const dateRange = queryByRange(
DateTime.parse('2024-01-01'),
DateTime.parse('2024-12-31')
);

const orders = await db.query(`
SELECT * FROM orders
WHERE created_at IN $range
`, {
range: dateRange
}).collect();

SurrealDB uses specific notation for ranges:

NotationDescriptionExample
a..=bInclusive both ends [a, b]1..=10
a..bInclusive start, exclusive end [a, b)1..10
a>..bExclusive start, exclusive end (a, b)1>..10
a>..=bExclusive start, inclusive end (a, b]1>..=10
// Good: Inclusive for dates (including full days)
const dateRange = new Range(
{ value: DateTime.parse('2024-01-01T00:00:00Z'), inclusive: true },
{ value: DateTime.parse('2024-01-31T23:59:59Z'), inclusive: true }
);

// Good: Exclusive end for array-like indexing
const arrayRange = new Range(
{ value: 0, inclusive: true },
{ value: 10, inclusive: false }
); // [0, 10)
// Good: Explicit types
const range: Range<number, number> = new Range(
{ value: 1, inclusive: true },
{ value: 100, inclusive: true }
);

// Good: Consistent types
const dateRange: Range<DateTime, DateTime> = new Range(
{ value: DateTime.now(), inclusive: true },
{ value: DateTime.now().plus(Duration.parse('1d')), inclusive: true }
);
// Good: Ensure start <= end
function createRange<T>(start: T, end: T): Range<T, T> | null {
if (start > end) {
console.error('Invalid range: start must be <= end');
return null;
}

return new Range(
{ value: start, inclusive: true },
{ value: end, inclusive: true }
);
}
  • Filtering - Filter records by numeric, date, or other ordered values

  • Pagination - Query records in ID ranges

  • Time Windows - Define time-based query windows

  • Price Filtering - E-commerce price range searches

  • Score Categorization - Categorize by score ranges (grades, ratings)

  • Geographic Bounds - Coordinate ranges for maps

Was this page helpful?