务必把PostERP的时日字段的资料型态设计为TIMESTAMP WITH TIME ZONE,不要设计成TIMESTAMP WITHOUT TIME ZONE资料型态。 |
请参考用户文档的Chapter 8日期、时间、时区。 |
PostERP支持单一数据库、多公司、多时区。
用户可以使用单一部数据库服务器,置於台湾,上面运行PostgreSQL。用户仅开设一个数据库posterp,这个单一数据库posterp就自动支持多家公司。例如:
数据库posterp同时支持甲公司和乙公司。甲公司的总公司所在地是台湾,其所在时区为UTC+8;乙公司的总公司所在地是日本,其所在时区为UTC+9。
假设你要设计一份报表供全球各公司、各终端用户使用,这份报表要接受终端用户指定的年、月,而SQL就调出交易时日发生於该年、月期间的分录#。则你可以善用PostERP提供的两对PostgreSQL function:
MonthBegin(year INTEGER,month INTEGER,company TEXT)、MonthBegin(PresentTime TIMESTAMPTZ,company TEXT)
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) |
然后分别指定各参数的用途:
com是公司#
year是年
month是月
我们再假设标的公司位於日本,终端用户於输入年度2012与月份7后并执行此报表,则SQL会过滤2012-7-1 00:00:00+9与2012-7-31 23:59:59.99+9之间的分录资料,无论执行此报表的终端用户位於哪个时区。同理,这份报表也适用於任何时区的标的公司。
至於MonthBegin(PresentTime TIMESTAMPTZ,company TEXT)和MonthBegin(PresentTime TIMESTAMPTZ,company TEXT),也有类似功能。假设你现在位於日本,当地时间为2012-07-08 15:20:40+09,正在操作位於台湾公司的资料,则:
MonthBegin(NOW(),:com)传回2012-07-01 00:00:00+08
MonthEnd(NOW(),:com)传回2012-07-31 23:59:59.99+08
PostERP实现一份设计,供位於多时区的多公司、多使用人使用的理念。而且,
方便终端用户:时日资料以终端用户所在时区显示。
PostERP的开发人员简单易懂:提供方便的PostgreSQL function,开发人员不需要担心复杂的时区转换处理。