日期算法

日期值可以减、加或减。

日期减法 :从另一个日期( DATE1 )减去一个日期( DATE2 )的结果是一个日期持续时间,它指定了两个日期之间的年数、月数和天数。 结果的数据类型为 DECIMAL(8,0)。 如果 DATE1 大于或等于 DATE2 ,则从 DATE1 中减去 DATE2。 如果 DATE1 小于 DATE2 ,则从 DATE2 中减去 DATE1 ,并将结果取负号。 以下程序描述阐明了操作步骤 RESULT = DATE1 - DATE2。

日期减法:结果 = date1 - date2
  • 如果 DAY(DATE2) <= DAY(DATE1) ,那么 DAY(RESULT) = DAY(DATE1) - DAY(DATE2)
  • 如果 DAY(DATE2) > DAY(DATE1) 然后是 DAY(RESULT) = N + DAY(DATE1) - DAY(DATE2) ,其中 N = MONTH(DATE2) 的最后一天。 MONTH(DATE2) 然后加1。
  • 如果 MONTH(DATE2) <= MONTH(DATE1) ,那么 MONTH(RESULT) = MONTH(DATE1) - MONTH(DATE2)
  • 如果 MONTH(DATE2) > MONTH(DATE1)MONTH(RESULT) = 12 + MONTH(DATE1) - MONTH(DATE2)YEAR(DATE2) 的值都增加1。
  • YEAR(RESULT) = YEAR(DATE1) - YEAR(DATE2)

例如,DATE('3/15/2005') - '12/31/2004'的结果是215(即0年2个月15天的时长)。 在这个例子中,请注意第二个操作数无需转换为日期。 根据 SQL中日期时间算术项下描述的减法规则之一,如果第一个操作数是日期,则第二个操作数可以是日期的字符串表示形式。

日期的递增和递减 :在日期上增加一个持续时间,或从日期中减去一个持续时间,其结果本身也是一个日期。 (在本操作中,一个月相当于一个日历页面。 因此,在日期上添加月份就像翻日历一样,从显示日期的那一页开始。) 结果必须介于公元2000年1月1日至公元1999年12月31日之间。 如果增加或减少年数,则仅日期的年份部分会受到影响。 月份和日期不变,除非结果为闰年2月29日。 此处,结果中的日期部分被设置为28,SQLCA中的 SQLWARN6 字段被设置为W,表示进行了月末调整,以更正无效日期。 SQLCA字段的描述也描述了如何设置 SQLWARN6。

同样,如果增加或减少几个月的时间,则只会影响几个月,必要时也会影响几年。 日期中的日期部分保持不变,除非结果无效(例如9月31日)。 在这种情况下,日期被设置为当月的最后一天,SQLCA的 SQLWARN6 字段被设置为W以表示调整。

当然,增加或减少天数会影响日期中的日部分,并可能影响月和年。 增加或减少天数不会导致月底调整。

日期的持续时间(无论是正值还是负值)也可以在日期中加减。 与标注的持续时间一样,结果是一个有效日期, SQLWARN6 被设置为W,以指示任何必要的月末调整。

当日期加上一个正值时间,或从日期中减去一个负值时间时,日期将按年、月、日的顺序递增,递增的数值为指定的数值。 因此, DATE1+X (其中 X 是正数,小数点后8位)等效于以下表达式:
  DATE1 + YEAR(X) YEARS + MONTH(X) MONTHS + DAY(X) DAYS
当从日期中减去一个正值日期持续时间,或向日期中添加一个负值日期持续时间时,日期将按照指定的天数、月数和年数递减,递减顺序为天、月、年。 因此, DATE1-X (其中 X 是正数,小数点后8位)相当于以下表达式:
  DATE1 - DAY(X) DAYS - MONTH(X) MONTHS - YEAR(X) YEARS

将日期加一个月等于一个月后的同一天,除非该日期在一个月后不存在。 在这种情况下,结果中的日期将设置为较晚月份的最后一天。 例如,1月28日加1个月等于2月28日;1月29日、30日或31日加1个月等于2月28日,如果是闰年,则等于2月29日。 如果给定日期增加了一个或多个月份,然后从结果中减去相同数量的月份,则最终日期不一定与原始日期相同。

如果给定日期增加了一个或多个月份,然后从结果中减去相同数量的月份,则最终日期不一定与原始日期相同。 此外,逻辑上等价的表达式可能不会产生相同的结果。 例如,以下两个表达式不会产生相同的结果:
   (DATE('2005 01 31') + 1 MONTH) + 1 MONTH    -- results in 2005-03-28 
   DATE('2005 01 31') + 2 MONTHS               -- results in 2005-03-31
标记日期持续时间在日期中加减的顺序会影响结果。 当您给日期添加标注的持续时间时,请按照年+月+日的顺序进行指定。 从日期中减去标注的日期持续时间时,请按照天-月-年的顺序指定。 例如,要在日期上添加一年零一天,请指定:
  DATE1 + 1 YEAR + 1 DAY
要从日期中减去一年、一个月和一天,请指定:
  DATE1 - 1 DAY - 1 MONTH - 1 YEAR