Loading the database…
Ctrl+Enter run · Ctrl+Shift+Enter check
Tables
SQLite vs SQL Server (Azure SQL) vs PostgreSQL
| Task | SQLite (this page) | SQL Server / Azure SQL | PostgreSQL |
|---|---|---|---|
| First 10 rows | LIMIT 10 | SELECT TOP 10 … or OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY | LIMIT 10 |
| Month bucket | strftime('%Y-%m', ts) | FORMAT(ts, 'yyyy-MM') or DATEFROMPARTS(YEAR(ts), MONTH(ts), 1) | to_char(ts, 'YYYY-MM') or date_trunc('month', ts) |
| Add 7 days | date(d, '+7 day') | DATEADD(day, 7, d) | d + interval '7 days' |
| Hours between | (julianday(b) - julianday(a)) * 24 | DATEDIFF(hour, a, b), which counts hour boundaries crossed | extract(epoch from b - a) / 3600 |
| Now | datetime('now') | GETDATE() or SYSUTCDATETIME() | now() |
| NULL fallback | COALESCE(x, 0) or IFNULL | COALESCE(x, 0) or ISNULL(x, 0) | COALESCE(x, 0) |
| Inline if | CASE WHEN … or iif() | CASE WHEN … or IIF() | CASE WHEN … |
| Join strings | a || b | a + b or CONCAT(a, b) | a || b or concat(a, b) |
| Integer division | 7 / 2 = 3; use 7.0 / 2 | 7 / 2 = 3; use 7.0 / 2 or CAST | 7 / 2 = 3; use 7.0 / 2 or ::numeric |
| Recursive CTE | WITH RECURSIVE | WITH (no RECURSIVE keyword) | WITH RECURSIVE |
| 90th percentile | No built-in; rank rows yourself | PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY x) OVER () | percentile_cont(0.9) WITHIN GROUP (ORDER BY x) |
| Booleans | 0 / 1 integers | BIT | boolean |
| Upsert | INSERT … ON CONFLICT DO UPDATE | MERGE | INSERT … ON CONFLICT DO UPDATE |