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()
.
更简单更安全
晚上好,我想知道 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()
.