pg_bikram_sambat

Bikram Sambat 日期类型与公历/尼泊尔历转换函数

概览

扩展包名版本分类许可证语言
pg_bikram_sambat0.1.0TYPEPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
3860pg_bikram_sambat-
相关扩展pg_duration pg_rrule pgcalendar timestamp9 pg_extra_time periods temporal_tables country

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.1.01817161514pg_bikram_sambat-
RPMPIGSTY0.1.01817161514pg_bikram_sambat_$v-
DEBPIGSTY0.1.01817161514postgresql-$v-pg-bikram-sambat-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
el8.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
el9.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
el9.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
el10.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
el10.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
d12.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
d12.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
d13.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
d13.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u22.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u22.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u24.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u24.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u26.x86_64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
u26.aarch64
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0
PIGSTY 0.1.0

构建

您可以使用 pig build 命令构建 pg_bikram_sambat 扩展的 RPM / DEB 包:

pig build pkg pg_bikram_sambat         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_bikram_sambat 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_bikram_sambat;          # 当前活跃 PG 版本安装
pig ext install -y pg_bikram_sambat -v 18  # PG 18
pig ext install -y pg_bikram_sambat -v 17  # PG 17
pig ext install -y pg_bikram_sambat -v 16  # PG 16
pig ext install -y pg_bikram_sambat -v 15  # PG 15
pig ext install -y pg_bikram_sambat -v 14  # PG 14
dnf install -y pg_bikram_sambat_18       # PG 18
dnf install -y pg_bikram_sambat_17       # PG 17
dnf install -y pg_bikram_sambat_16       # PG 16
dnf install -y pg_bikram_sambat_15       # PG 15
dnf install -y pg_bikram_sambat_14       # PG 14
apt install -y postgresql-18-pg-bikram-sambat   # PG 18
apt install -y postgresql-17-pg-bikram-sambat   # PG 17
apt install -y postgresql-16-pg-bikram-sambat   # PG 16
apt install -y postgresql-15-pg-bikram-sambat   # PG 15
apt install -y postgresql-14-pg-bikram-sambat   # PG 14

创建扩展

CREATE EXTENSION pg_bikram_sambat;

用法

来源:PGXN metadataPGXN source treetype SQLfunction SQLoperator SQLcast SQLregression examplesTODO

来源说明:CSV 中的 GitHub URL 不可用,因此本文依据官方 PGXN 元数据与源码包 SQL。

pg_bikram_sambat 添加 bs_date 类型,用于 Bikram Sambat 日期,并提供转换、格式化、比较和 btree 索引支持。按普通 PostgreSQL 扩展安装:

CREATE EXTENSION pg_bikram_sambat;

日期类型

bs_date 存储 Bikram Sambat 日期,并以 YYYY-MM-DD 显示。文本输入接受用 /-. 分隔的年/月/日值;当年份出现在最后一个字段时,输入解析器也接受日优先字符串。

SELECT '2057/10/19'::bs_date;
SELECT CAST('2057-10-19' AS bs_date);
SELECT '19.10.2057'::bs_date;

像其他 PostgreSQL 类型一样在表中使用:

CREATE TABLE events (
  id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  ad_date date,
  bs bs_date NOT NULL
);

INSERT INTO events (ad_date, bs)
VALUES
  ('2001-02-01', '2057/10/19'),
  ('1972-02-17', '2028/11/05');

转换函数

ad_to_bs(date) 将 Gregorian date 转换为 bs_date

SELECT ad_to_bs('2001-02-01'::date);  -- 2057-10-19
SELECT ad_to_bs('1972-02-17'::date);  -- 2028-11-05

current_bs_date() 返回转换为 bs_date 的当前事务时间戳,因此同一事务内重复调用是稳定的:

SELECT current_bs_date();
SELECT pg_typeof(current_bs_date());  -- bs_date

版本 0.1.0 不暴露 SQL bs_to_ad() 函数,也没有直接的 bs_datedate cast;上游 TODO 文件将这些列为后续工作。

格式化

该扩展为 bs_date 重载 PostgreSQL to_char

SELECT to_char('2057/10/19'::bs_date, 'YYYY-MM-DD');
SELECT to_char('2057/10/19'::bs_date, 'DD/MM/YYYY');
SELECT to_char('2057/10/19'::bs_date, 'Month DD, YYYY');
SELECT to_char('2057/10/19'::bs_date, 'Day, DD Month YYYY');

支持的日期格式 token 为 YYYYYYMonthMonMMDayDyDD。月份与星期名称会跟随格式 token 的大小写,因此 MONTHMonthmonth 分别生成大写、标题式大小写和小写英文名称。

第三个参数传入 dev 时,使用 Devanagari 数字、月份名称和星期名称:

SELECT to_char('2057/10/19'::bs_date, 'YYYY-MM-DD', 'dev');
SELECT to_char('2057/10/19'::bs_date, 'Day, DD Month YYYY', 'dev');

操作符与索引

bs_date 支持比较操作符 =<>>>=<<=。默认 btree 操作符类 bs_date_ops 支持普通 btree 索引、范围谓词和排序:

CREATE INDEX events_bs_idx ON events (bs);

SELECT * FROM events WHERE bs >= '2057/01/01' ORDER BY bs;
SELECT * FROM events WHERE bs BETWEEN '2056/01/01' AND '2058/12/12';

注意事项

打包的转换数据集覆盖 BS 年份 20002100,并以 1943-04-14 AD 作为 2000-01-01 BS 的参考日期。参考日期之前或映射 BS 范围之外的日期会抛出 PostgreSQL 错误。该扩展定义了从 textbs_date 的隐式 cast,但没有定义从任意数值类型到 bs_date 的 cast。


最后修改 2026-05-01: update extension data (e399d22)