oracle sql 开发人员处理月

oracle sql developer dealing with months

晚上好,我想知道 oracle 中的 sql 中 (SYSDATE-hire_date)/12 AS MONTHS 和 MONTHS_BETWEEN(SYSDATE, hire_date) 因为两者都会产生不同的结果。

提前致谢

当你得到周数时:

SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM employees WHERE department_id = 90;

LAST_NAME                        WEEKS
------------------------- ------------
King                          1481.247
Kochhar                       1363.104
De Haan                       1190.247

...你要除以七,因为一周有 7 天。

两个日期之间经过的SYSDATE-fire_date表达式gives you the number of days:

SELECT last_name, hire_date, SYSDATE-hire_date AS DAYS,
  (SYSDATE-hire_date)/7 AS WEEKS
FROM employees WHERE department_id = 90;

LAST_NAME                 HIRE_DATE          DAYS        WEEKS
------------------------- ---------- ------------ ------------
King                      1987-06-17    10368.732     1481.247
Kochhar                   1989-09-21     9541.732     1363.105
De Haan                   1993-01-13     8331.732     1190.247

所以从 1987-06-17 到今天 2015-11-05 共有 10368 天,加上从午夜到当前时间的 0.732 天,17:34。您可能对小数天数并不真正感兴趣,因此您可以 trunc() SYSDATE 或减法的结果;并在除以七的结果上使用 trunc() 将得到整周数。

您正在尝试使用两种计算方式调整它以计算月而不是周:

SELECT last_name, (SYSDATE-hire_date)/12 AS MONTHS1,
  MONTHS_BETWEEN(SYSDATE, hire_date) AS MONTHS2
FROM employees WHERE department_id = 90;

LAST_NAME                      MONTHS1      MONTHS2
------------------------- ------------ ------------
King                           864.061      340.637
Kochhar                        795.145      313.508
De Haan                        694.311      273.766

结果如此不同,因为你错误地除以 12。一年有 12 个月,而不是一个月有 12 天;如果您尝试通过除以 52 而不是 7 来计算周数,您会看到类似的差异。

正如@lad2025 在评论中指出的那样,一个近似的等价物是除以 30:

SELECT last_name, (SYSDATE-hire_date)/30 AS MONTHS1,
  MONTHS_BETWEEN(SYSDATE, hire_date) AS MONTHS2
FROM employees WHERE department_id = 90;

LAST_NAME                      MONTHS1      MONTHS2
------------------------- ------------ ------------
King                           345.625      340.637
Kochhar                        318.058      313.508
De Haan                        277.725      273.766

仍然不一样,因为大多数月份都没有恰好 30 天。除以 365/12,即约 30.42:

SELECT last_name, (SYSDATE-hire_date)/(365/12) AS MONTHS1,
  MONTHS_BETWEEN(SYSDATE, hire_date) AS MONTHS2
FROM employees WHERE department_id = 90;

LAST_NAME                      MONTHS1      MONTHS2
------------------------- ------------ ------------
King                           340.890      340.637
Kochhar                        313.701      313.508
De Haan                        273.920      273.766

但它不会完全相同(除了可能在某些短时间内),因为算法不一样,而且这仍然不考虑闰年。只使用 months_between().

更简单更安全