如何 return 从 2 个月前的月份开始的第 14 天,在 Oracle SQL 中确定时间?
How to return 14th day from month which was 2 months ago with determinated time in Oracle SQL?
如何在 Oracle SQL 中从时间为 23:59:59
的 2 个月前的月份中提取第 14 天?
我有如下查询,我需要回答如下(类似样式):
select to_char(to_date(LAST_DAY(ADD_MONTHS(sysdate, -2)), 'YY-MM-DD'), 'YY/MM/DD) from dual
上面的查询 return:21/12/31
,不过我需要像上面这样的查询,它将 return 值:'21/12/14 23:59:59'
如果我没理解错的话,那么
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> select trunc(last_day(add_months(sysdate, -3)) + 15) - interval '1' second as result
2 from dual;
RESULT
--------------------------------------------------------------------------------
14.12.2021 23:59:59
SQL>
或者,如果它必须是 格式的 字符串(以上值为 DATE):
SQL> select to_char(trunc(last_day(add_months(sysdate, -3)) + 15) - interval '1' second, 'yy/mm/dd hh24:mi:ss') as result
2 from dual;
RESULT
--------------------------------------------------------------------------------
21/12/14 23:59:59
SQL>
您可以截断到当月的开始而不是使用 last_day
,然后加上 14 天并减去一秒 - 这里使用 date arithmetic 和小数天,但您也可以使用间隔(如@MTO 所示):
select add_months(trunc(sysdate, 'MM'), -2) + 14 - 1/86400 from dual
这给你一个日期值 2021-12-14 23:59:59。然后,您可以根据需要对其进行格式化。
您当前的方法是在日期和字符串之间进行转换,但依赖于隐式转换,这不是一个好主意。我已将其包含在 fiddle 中,因此您可以看到它因不同的会话设置而中断。
您可以使用:
SELECT ADD_MONTHS(TRUNC(sysdate, 'MM'), -2)
+ INTERVAL '13 23:59:59' DAY TO SECOND AS day
FROM DUAL
输出:
DAY
2021-12-14 23:59:59
如果你想用特定的格式格式化然后使用 TO_CHAR
:
SELECT TO_CHAR(
ADD_MONTHS(TRUNC(sysdate, 'MM'), -2)
+ INTERVAL '13 23:59:59' DAY TO SECOND,
'YYYY-MM-DD HH24:MI:SS'
) AS day
FROM DUAL
db<>fiddle here
如何在 Oracle SQL 中从时间为 23:59:59
的 2 个月前的月份中提取第 14 天?
我有如下查询,我需要回答如下(类似样式):
select to_char(to_date(LAST_DAY(ADD_MONTHS(sysdate, -2)), 'YY-MM-DD'), 'YY/MM/DD) from dual
上面的查询 return:21/12/31
,不过我需要像上面这样的查询,它将 return 值:'21/12/14 23:59:59'
如果我没理解错的话,那么
SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';
Session altered.
SQL> select trunc(last_day(add_months(sysdate, -3)) + 15) - interval '1' second as result
2 from dual;
RESULT
--------------------------------------------------------------------------------
14.12.2021 23:59:59
SQL>
或者,如果它必须是 格式的 字符串(以上值为 DATE):
SQL> select to_char(trunc(last_day(add_months(sysdate, -3)) + 15) - interval '1' second, 'yy/mm/dd hh24:mi:ss') as result
2 from dual;
RESULT
--------------------------------------------------------------------------------
21/12/14 23:59:59
SQL>
您可以截断到当月的开始而不是使用 last_day
,然后加上 14 天并减去一秒 - 这里使用 date arithmetic 和小数天,但您也可以使用间隔(如@MTO 所示):
select add_months(trunc(sysdate, 'MM'), -2) + 14 - 1/86400 from dual
这给你一个日期值 2021-12-14 23:59:59。然后,您可以根据需要对其进行格式化。
您当前的方法是在日期和字符串之间进行转换,但依赖于隐式转换,这不是一个好主意。我已将其包含在 fiddle 中,因此您可以看到它因不同的会话设置而中断。
您可以使用:
SELECT ADD_MONTHS(TRUNC(sysdate, 'MM'), -2)
+ INTERVAL '13 23:59:59' DAY TO SECOND AS day
FROM DUAL
输出:
DAY 2021-12-14 23:59:59
如果你想用特定的格式格式化然后使用 TO_CHAR
:
SELECT TO_CHAR(
ADD_MONTHS(TRUNC(sysdate, 'MM'), -2)
+ INTERVAL '13 23:59:59' DAY TO SECOND,
'YYYY-MM-DD HH24:MI:SS'
) AS day
FROM DUAL
db<>fiddle here