18.4. 日期、时间、时区

Important

务必把PostERP的时日字段的资料型态设计为TIMESTAMP WITH TIME ZONE,不要设计成TIMESTAMP WITHOUT TIME ZONE资料型态。

Tip

请参考用户文档的Chapter 8日期、时间、时区。

PostERP支持单一数据库、多公司、多时区

用户可以使用单一部数据库服务器,置於台湾,上面运行PostgreSQL。用户仅开设一个数据库posterp,这个单一数据库posterp就自动支持多家公司。例如:

数据库posterp同时支持公司和公司。公司的总公司所在地是台湾,其所在时区为UTC+8公司的总公司所在地是日本,其所在时区为UTC+9

假设你要设计一份报表供全球各公司、各终端用户使用,这份报表要接受终端用户指定的年、月,而SQL就调出交易时日发生於该年、月期间的分录#。则你可以善用PostERP提供的两对PostgreSQL function

  1. MonthBegin(year INTEGER,month INTEGER,company TEXT)MonthBegin(PresentTime TIMESTAMPTZ,company TEXT)

  2. MonthEnd(year INTEGER,month INTEGER,company TEXT)MonthEnd(PresentTime TIMESTAMPTZ,company TEXT)

这样设计SQL:

SELECT f1 FROM t52 WHERE f0=:com AND f2 BETWEEN MonthBegin(:year,:month,:com) AND MonthEnd(:year,:month,:com)
		

然后分别指定各参数的用途:

我们再假设标的公司位於日本,终端用户於输入年度2012与月份7后并执行此报表,则SQL会过滤2012-7-1 00:00:00+92012-7-31 23:59:59.99+9之间的分录资料,无论执行此报表的终端用户位於哪个时区。同理,这份报表也适用於任何时区的标的公司。

至於MonthBegin(PresentTime TIMESTAMPTZ,company TEXT)MonthBegin(PresentTime TIMESTAMPTZ,company TEXT),也有类似功能。假设你现在位於日本,当地时间为2012-07-08 15:20:40+09,正在操作位於台湾公司的资料,则:

PostERP实现一份设计,供位於多时区的多公司、多使用人使用的理念。而且,