【问题标题】:SQL: How to properly nest TRIM() methodSQL:如何正确嵌套 TRIM() 方法
【发布时间】:2025-12-30 05:30:16
【问题描述】:

我正在处理一个家庭作业问题,我的功能运行良好。我完成了教授的要求,但我需要帮助使用 Trim() 方法格式化我的最后一条语句。我不知道如何用其他两种方法正确嵌套它。我在第一行做得很好,但我在第 3 行很难格式化“FIRST_PAY DAY”列的日期。下面是我使用一个 Trim() 方法的工作函数-

SQL> SELECT empno, ename, sal, TRIM(TO_CHAR(hiredate, 'Month')) || ' ' || 
     TO_CHAR(hiredate, 'fmddTH, YYYY') AS "HIRE DAY",
  2  TO_CHAR(NEXT_DAY(hiredate, 'FRIDAY'),
  3  'Month fmddTH, YYYY') "FIRST_PAY DAY"
  4  FROM emp;

谢谢!

这是我尝试做的代码,但没有成功-

SQL> SELECT empno, ename, sal, TRIM(TO_CHAR(hiredate, 'Month')) || ' ' || 
     TO_CHAR(hiredate, 'fmddTH, YYYY') AS "HIRE DAY",
  2  TO_CHAR(NEXT_DAY(hiredate, 'FRIDAY'),
  3  TRIM(TO_CHAR('Month')) || ' ' || TO_CHAR('fmddTH, YYYY')) 
     "FIRST_PAY DAY"
  4  FROM emp;

“HIRE DAY”列使用 TRIM() 方法正确格式化,但“First_PAY DAY”列不正确。下面是我从两个日期列输出的一部分-

  HIRE DAY              FIRST_PAY DAY
 ___________________   ___________________
 May 1st, 1981         May       8th, 1981

【问题讨论】:

  • 明确显示你得到的输出,以及你期望的输出。
  • 我编辑了帖子,以便您查看。谢谢。
  • 您也可以使用'fmMonth' - 'fm' 将删除填充。见docs.oracle.com/cd/B19306_01/server.102/b14200/…
  • 这很好用!但是对于个位数日期,我得到一个前导“0”。有什么建议么?这是我的代码-'fmMonth fmddTH, YYYY') "FIRST_PAY DAY"
  • 我想去掉 'ddTH' 中的 'fm'。现在完美运行。谢谢你,@kfinity。

标签: sql oracle trim


【解决方案1】:

月份值较大,需要自行修剪。

试试吧。

TRIM(TRIM(TO_CHAR('Month'))) || ' ' || TO_CHAR('fmddTH, YYYY')) "FIRST_PAY DAY"

您的代码首先连接字段,然后修剪结果。到那时,修剪月份和日期之间的区域为时已晚。

Oracle 有很好的日期格式。多花几分钟时间来探索可用的日期格式是值得的。很可能您可以通过一次 to_char(date, 'several-date-format-codes-can-go-here') 调用生成所需的输出。

针对您的评论,这是一个使用 sysdate 代替hiredate 并从虚拟对偶表中选择而不是emp 的工作示例。

select TO_CHAR(sysdate, 'Month') || 
       ' ' || 
       TO_CHAR(sysdate, 'fmddTH, YYYY') AS "HIRE DAY", 
       TO_CHAR(NEXT_DAY(sysdate, 'FRIDAY')), 
       TRIM(TRIM(TO_CHAR(sysdate, 'Month'))) || 
       ' ' || 
       TO_CHAR(sysdate, 'fmddTH, YYYY') "FIRST_PAY DAY"
       FROM dual;

您的一些 TO_CHAR 似乎缺少雇用日期

【讨论】:

  • 感谢您的帮助,但我尝试了您的代码,但它不起作用。这是我输入的内容- SQL> SELECT empno, ename, sal, TRIM(TO_CHAR(hiredate, 'Month')) || '' || 2 TO_CHAR(hiredate, 'fmddTH, YYYY') AS "HIRE DAY", 3 TO_CHAR(NEXT_DAY(hiredate, 'FRIDAY'), 4 TRIM(TRIM(TO_CHAR('Month'))) || '' || TO_CHAR( 'fmddTH, YYYY')) "FIRST_PAY DAY" 5 FROM emp;
【解决方案2】:
select to_char(hiredate,'fmMonth ddth, yyyy') as hiredate,
to_char(next_day(hiredate, 'FRIDAY'),'fmMonth ddth, yyyy') as payday
from emp;

上面有什么问题吗?

最好的问候, 炖阿什顿

【讨论】: