PostgreSQL 儒略历学习资料
参考资料
Julian day number
pg source cdoe “src\backend\utils\adt\datetime.c”(317,1)
PostgreSQL Timestamp通过C函数转换为Date
Datum to_date1(PG_FUNCTION_ARGS) {Timestamp timestamp = PG_GETARG_TIMESTAMP(0);DateADT result;struct pg_tm tt,*tm = &tt;fsec_t fsec;if (TIMESTAMP_IS_NOBEGIN(timestamp))DATE_NOBEGIN(result);else if (TIMESTAMP_IS_NOEND(timestamp))DATE_NOEND(result);else {if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),errmsg("timestamp out of range")));result = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - POSTGRES_EPOCH_JDATE;}PG_RETURN_DATEADT(result);
}
Datum to_date2(PG_FUNCTION_ARGS) {TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(0);DateADT result;struct pg_tm tt,*tm = &tt;fsec_t fsec;int tz;if (TIMESTAMP_IS_NOBEGIN(timestamp))DATE_NOBEGIN(result);else if (TIMESTAMP_IS_NOEND(timestamp))DATE_NOEND(result);else {if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),errmsg("timestamp out of range")));result = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) - POSTGRES_EPOCH_JDATE;}PG_RETURN_DATEADT(result);
}
timestamp2tm(timestamp dt, int *tzp, struct tm *tm, fsec_t *fsec, const char **tzn),函数实现文件为”\src\interfaces\ecpg\pgtypeslib\timestamp.c”(99,1):\
其中调用了函数
int j2date(int jd, int *year, int *month, int *day),实现文件为”src\backend\utils\adt\datetime.c”(317,1);
int date2j(int y, int m, int d),实现文件为”src\backend\utils\adt\datetime.c”(291,1);
其中一些常量不是太明白,经过搜索,请参看文档
Julian day number
select make_date(2000,1,1) - make_interval(days=>2451545),
make_date(1970,1,1) - make_interval(days=>2440588 )output
4714-11-24 00:00:00 BC, 4714-11-24 00:00:00 BC
因此儒略历的日期偏移为
/* Julian-date equivalents of Day 0 in Unix and Postgres reckoning */
#define UNIX_EPOCH_JDATE 2440588 /* == date2j(1970, 1, 1) */
#define POSTGRES_EPOCH_JDATE 2451545 /* == date2j(2000, 1, 1) */
例如:2000年1月1日中午对应于JD = 2451545.0
drop function if exists d2j(date);
create or replace function d2j(date) returns float8
as $$declarev_year integer;v_month integer;v_day integer;v_a integer; v_y integer;v_m integer;v_jdn integer;v_jd float8;beginv_year := date_part('year',$1);v_month := date_part('month',$1);v_day := date_part('day',$1);v_a := (14-v_month) / 12;v_y := v_year+4800-v_a;v_m := v_month+12*v_a-3;v_jdn := v_day + ((153 * v_m + 2)/5) + (365* v_y) + (v_y / 4) - (v_y / 100) + (v_y / 400) - 32045;v_jd := v_jdn+ ( (0-12)/24 ) + (0/1440) + (0/86400);return v_jd;end;
$$ language plpgsql;
--验证结果,可以通过"jd mon 7"来计算星期几,其中0表示星期一。
with cte as(select d2j(make_date(2000,1,1)) as f1
)select f1, (((f1::integer)%7) +1) as week from cte;
PostgreSQL 儒略历学习资料相关推荐
- 程序员优秀学习资料整理(不断更新中)
如果你发现自己陷入各种新技术.工具包围中,而纠结于该选择哪些学习,读读这篇文章,技术的执念. 综合资源 资源链接汇集 awesome - 各种主流语言的优秀项目汇集 :+1: lists - 资源集合 ...
- go学习资料以及开源代码
Go 语言方面的大牛,或者优秀 Go 项目的组织 mattn - 写了数百个 Go 项目,盛产优质项目 Unknwon - gogs/macaron 等项目作者,<The Way to Go&g ...
- 【收藏清单】AI学习资料汇总——你想要的AI资源,这里都有
本文汇总了TinyMind站内AI资料类热门文章TOP10,欢迎大家各取所需.来源:https://www.tinymind.cn/ 1.[AI入门者必看]--人工智能技术人才成长路线图 入门AI的两 ...
- Django介绍和虚拟环境(django特点、MVC、MVT、Django学习资料)
MVT流程: 创建Django项目和应用 django-admin startproject name python manager.py startapp name 视图和ULR 视图的请求和响应 ...
- 彻底搞懂基于LOAM框架的3D激光SLAM全套学习资料汇总!
地图定位算法是自动驾驶模块的核心,而激光SLAM则是地图定位算法的关键技术,其重要性不言而喻,在许多AI产品中应用非常多(包括但不限于自动驾驶.移动机器人.扫地机等).相比于传统的视觉传感器,激光传感 ...
- 史上最全DSO学习资料
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 DSO(Direct Sparse Odometry)是一种视觉里程计方法.在SLAM领域,DSO属于 ...
- 教程 | 一文读懂自学机器学习的误区和陷阱(附学习资料)
来源:机器学习与统计学 本文约6296字,建议阅读10分钟. 本文为你指出一些自学的误区,推荐学习资料,提供客观可行的学习表并给出进阶学习的建议. 后台回复"20190426"获取 ...
- 独家 | 一文带你上手卷积神经网络实战(附数据集学习资料)
原文标题:Understanding deep Convolutional Neural Networks with a practical use-case in Tensorflow and Ke ...
- 限时删!一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)
AI 显然是最近几年非常火的一个新技术方向,从几年前大家认识到 AI 的能力,到现在产业里已经在普遍的探讨 AI 如何落地了. 计算机视觉目前在很多领域都已经实现了商业应用,从现实市场规模角度,目前人 ...
最新文章
- pdf转ppt_怎么在线把pdf转ppt?这个pdf转ppt方法太好用
- 做好准备迎接崭新的BCH了吗?
- php面向对象中的魔术方法中文说明
- 在JAVA 中将堆与栈分开的原因
- WebStorm 10支持TypeScript 1.4到JavaScript的实时编译
- assembly plugin实现自定义打包
- Registry Size 提示注册表容量不够!
- PHP GZ压缩与解压
- 百度地图 android SDKv2.2.0
- 一分钟教你解决前端分流问题
- 因为制作爬虫程序,我收到了警告
- 大创笔记——硬切法实现基于单片机的人机交互系统
- Android打造通用标题栏——让你的App统一标题栏风格
- c++ string常用函数
- 阿里巴巴的合伙人制度!
- 一个基于PyTorch实现的Glove词向量的实例
- 双十一到了,当我用Python采集了电商平台所有商品后发现....
- Python 爬取百度音乐
- 【MongoDB】MacOS安装MongoDB完整收录
- Apollo项目导航模式下的坐标转换研究