age由中的
timestamptz_age函数计算
src/backend/utils/adt/timestamp.c。评论说:
该代码首先将参数转换为
struct pg_tm变量
tm1,
tm2(
struct pg_tm类似于C库的
structtm,但具有其他时区字段),然后计算
tm每个字段的差值。
在的情况下
age('2018-07-01','2018-05-20'),该差异的相关字段如下所示:
tm_mday = -19tm_mon = 2tm_year = 0
现在,负字段已调整。对于
tm_mday,代码如下所示:
while (tm->tm_mday < 0){ if (dt1 < dt2) { tm->tm_mday += day_tab[isleap(tm1->tm_year)][tm1->tm_mon - 1]; tm->tm_mon--; } else { tm->tm_mday += day_tab[isleap(tm2->tm_year)][tm2->tm_mon - 1]; tm->tm_mon--; }}
由于
dt1 > dt2采用
else分支,因此代码添加了五月(31)天的天数,并将月份减少了1,最后得出
tm_mday = 12tm_mon = 1tm_year = 0
那就是你得到的结果。
现在乍一看似乎
tm2->tm_mon不是选择的正确月份,而最好将左侧参数的前一个月份作为选择:
day_tab[isleap(tm1->tm_year)][(tm1->tm_mon + 10) % 12]
但是我不能说这种选择是否在所有情况下都会更好,并且无论如何注释都会损害该功能,因此我不愿意将其称为错误。
您可能想使用黑客邮件列表。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)