相信大部份做程序员的同志对该问题都是含糊而过。
但是这却实是一个值得注意的问题,比如说让你统计当前日期向前的一个月内的销售总和,或当前日期向后一个月内的销售总和,你会怎么做呢?简单的ADD_MONTHS?
看看下图上的信息1030和1031的一个月后的日期都是1130:
在接着看,1130的一个月前的日期却是1031:
为了说明问题的严重性,下面我来举个例子:
CREATE TABLE TST1( UPD_DATE DATE, QTY NUMBER )
BEGIN INSERT INTO TST1 VALUES (TO_DATE('20061030','YYYYMMDD'),300); INSERT INTO TST1 VALUES (TO_DATE('20061031','YYYYMMDD'),300); INSERT INTO TST1 VALUES (TO_DATE('20061101','YYYYMMDD'),300); INSERT INTO TST1 VALUES (TO_DATE('20061130','YYYYMMDD'),300); COMMIT; END;
现在要取出一个月后(包括当前日期)的销售和:
SELECT O.UPD_DATE,O.QTY, SUM(A.QTY) AS NEXT_MONTH_QTY, ADD_MONTHS(O.UPD_DATE,1) AS NEXT_MONTH_DATE FROM TST1 O LEFT JOIN TST1 A ON A.UPD_DATE BETWEEN O.UPD_DATE AND ADD_MONTHS(O.UPD_DATE,1) GROUP BY O.UPD_DATE,O.QTY ORDER BY UPD_DATE
结果如图所示:
20061030的一个月后的销售量和为:1200,按理来说,20061130的一个月前(包括 20061130)的销售量和也该为:1200,但是真的是这样的吗?下面取出一个月前(包括)的销售量和:
SELECT O.UPD_DATE,O.QTY, SUM(A.QTY) AS NEXT_MONTH_QTY, ADD_MONTHS(O.UPD_DATE,-1) AS PRE_MONTHS_DATE FROM TST1 O LEFT JOIN TST1 A ON A.UPD_DATE BETWEEN ADD_MONTHS(O.UPD_DATE,-1) AND O.UPD_DATE GROUP BY O.UPD_DATE,O.QTY ORDER BY UPD_DATE
结果是什么?少了300!为什么?因为20061130的一个月前的日期是:20061031,而没有把20061030算进来!
有出入了吧!
|