文档章节

PostgreSQL 时间/日期 常用函数

yonj1e
 yonj1e
发布于 2017/03/31 14:03
字数 792
阅读 139
收藏 0

PostgreSQL 支持 SQL标准中所有的日期和时间类型

日期/时间类型

名字 描述
timestamp [ (p) ] [ without time zone ] 日期和时间(无时区)
timestamp [ (p) ] with time zone 日期和时间,有时区
date 只用于日期
time [ (p) ] [ without time zone ] 只用于一日内时间
time [ (p) ] with time zone 只用于一日内时间,带时区
interval [ fields ] [ (p) ] 时间间隔

 date 类型定义,整型,date的输入输出函数使它表示成‘yyyy-mm-dd’,后面介绍这些函数

typedef int32 DateADT;

 time 类型定义,时间部分是整型。TimeTzADT 结构体是时区

#ifdef HAVE_INT64_TIMESTAMP
typedef int64 TimeADT;
#else
typedef float8 TimeADT;
#endif

typedef struct
{
	TimeADT		time;			/* all time units other than months and years */
	int32		zone;			/* numeric time zone, in seconds */
} TimeTzADT;

 

PostgreSQL 使用儒略历法(Julian dates)来进行所有的日期/时间计算。(儒略日、朱莉安不同译法而已)

解释一下朱莉安日历(Julian date):

普通日历:朱莉安日历:

174表示的是从2016年1月1日开始到今天已有174天了

普通日历是按月计数,朱莉安日历是按年计数

 

datetime.h
        Definitions for date/time support code.

src/include/utils/datetime.h

声明了 date,Julian date 转换的相关函数

/* 朱莉安日期转换日历时间 */
extern void j2date(int jd, int *year, int *month, int *day);

/* 日历时间与朱莉安日历的转换 */
extern int	date2j(int year, int month, int day);

/* 朱莉安日期转换为星期几 */
extern int	j2day(int jd);

 

date.h
        Definitions for the SQL "date" and "time" types.

src/include/utils/date.h

Datum、date、time 类型的转换以及输入输出函数,上面的将 typedef int32 DateADT 输出“yyyy-mm-dd”

/*
 * Macros for fmgr-callable functions.
 *
 * For TimeADT, we make use of the same support routines as for float8 or int64.
 * Therefore TimeADT is pass-by-reference if and only if float8 or int64 is!
 */
#ifdef HAVE_INT64_TIMESTAMP

#define MAX_TIME_PRECISION 6

#define DatumGetDateADT(X)	  ((DateADT) DatumGetInt32(X))
#define DatumGetTimeADT(X)	  ((TimeADT) DatumGetInt64(X))
#define DatumGetTimeTzADTP(X) ((TimeTzADT *) DatumGetPointer(X))

#define DateADTGetDatum(X)	  Int32GetDatum(X)
#define TimeADTGetDatum(X)	  Int64GetDatum(X)
#define TimeTzADTPGetDatum(X) PointerGetDatum(X)
#else							/* !HAVE_INT64_TIMESTAMP */

#define MAX_TIME_PRECISION 10

/* round off to MAX_TIME_PRECISION decimal places */
#define TIME_PREC_INV 10000000000.0
#define TIMEROUND(j) (rint(((double) (j)) * TIME_PREC_INV) / TIME_PREC_INV)

#define DatumGetDateADT(X)	  ((DateADT) DatumGetInt32(X))
#define DatumGetTimeADT(X)	  ((TimeADT) DatumGetFloat8(X))
#define DatumGetTimeTzADTP(X) ((TimeTzADT *) DatumGetPointer(X))

#define DateADTGetDatum(X)	  Int32GetDatum(X)
#define TimeADTGetDatum(X)	  Float8GetDatum(X)
#define TimeTzADTPGetDatum(X) PointerGetDatum(X)
#endif   /* HAVE_INT64_TIMESTAMP */

#define PG_GETARG_DATEADT(n)	 DatumGetDateADT(PG_GETARG_DATUM(n))
#define PG_GETARG_TIMEADT(n)	 DatumGetTimeADT(PG_GETARG_DATUM(n))
#define PG_GETARG_TIMETZADT_P(n) DatumGetTimeTzADTP(PG_GETARG_DATUM(n))

#define PG_RETURN_DATEADT(x)	 return DateADTGetDatum(x)
#define PG_RETURN_TIMEADT(x)	 return TimeADTGetDatum(x)
#define PG_RETURN_TIMETZADT_P(x) return TimeTzADTPGetDatum(x)

 日期/时间类型转换的相关函数,下面只介绍几个类型转换的函数,不一一列举

extern Datum date_timestamp(PG_FUNCTION_ARGS);
extern Datum timestamp_date(PG_FUNCTION_ARGS);
extern Datum date_timestamptz(PG_FUNCTION_ARGS);
extern Datum timestamptz_date(PG_FUNCTION_ARGS);
extern Datum datetime_timestamp(PG_FUNCTION_ARGS);

extern Datum timestamp_time(PG_FUNCTION_ARGS);
extern Datum timestamptz_time(PG_FUNCTION_ARGS);
extern Datum time_interval(PG_FUNCTION_ARGS);
extern Datum interval_time(PG_FUNCTION_ARGS);

timestamp、timestametz 可由 date 类型转换而来。 
 

pgtime.h
        PostgreSQL internal timezone library

src/include/pgtime.h

声明了pg_tm 结构体

struct pg_tm
{
	int			tm_sec;        
	int			tm_min;
	int			tm_hour;
	int			tm_mday;        /* 1..31 */
	int			tm_mon;			/* origin 0, not 1 */
	int			tm_year;		/* relative to 1900 */
	int			tm_wday;        /* 0..6 (0是周一)*/
	int			tm_yday;        /* 1..366 Julian date */
	int			tm_isdst;
	long int	tm_gmtoff;
	const char *tm_zone;
};

 

timestamp.h
        Definitions for the SQL "timestamp" and "interval" types.

src/include/utils/timestamp.h

声明了timestamp interval 类型相关的函数,这里介绍下 pg_tm 结构体跟 timestamp 的转换函数,后面介绍 pg_tm

extern int tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt);
extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone);

© 著作权归作者所有

yonj1e
粉丝 18
博文 20
码字总数 31358
作品 0
济南
后端工程师
私信 提问
PostgreSQL的时间/日期函数使用

PostgreSQL的常用时间函数使用整理如下: 一、获取系统时间函数 1.1 获取当前完整时间 select now(); david=# select now(); -------------------------------2013-04-12 15:39:40.399711+08...

Nonry
2017/09/07
42
0
EDB PPAS(Oracle 兼容版) Oracle与PostgreSQL 兼容模式的参数配置切换

标签 PostgreSQL , EDB , PPAS , 参数 , Oracle模式 , PostgreSQL模式 背景 EDB PPAS是EDB推出的一款同时兼容Oracle和PostgreSQL协议的数据库,在去O的场景中,使用非常广泛,价格便宜,同时...

德哥
2018/05/06
0
0
PostgreSQL学习手册(五) 函数和操作符

一、逻辑操作符: 常用的逻辑操作符有:AND、OR和NOT。其语义与其它编程语言中的逻辑操作符完全相同。 二、比较操作符: 下面是PostgreSQL中提供的比较操作符列表: 操作符 描述 < 小于 > 大...

长平狐
2012/08/27
1K
0
[笔记]将系统的数据库从MySQL 5.5迁移到PostgreSQL 9.1

环境 Windows Server 2003 x64 简体中文, MySQL 5.5 (UTF8编码), PostgreSQL 9.1.4-1 (UTF8编码) Spring 3.0.7, Struts 2.3.4, Hibernate 3.5.5 从MySQL迁移到PostgreSQL ------------------......

leeoo
2012/07/22
1K
3
PostgreSQL数据类型-数据类型简介和布尔类型

PostgreSQL相对于其他数据库,支持数据类型很多。 PostgreSQL数据类型有布尔类型、整数类型、字符串类型、二进制字符串类型、位串类型、时间与日期类型、枚举类型、几何类型、网络地址类型、...

白豆腐徐长卿
2017/11/06
61
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
5
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
8
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部