0
SELECT months_between(TO_DATE(SYSDATE,'DD-MM-YYYY'),TO_DATE(DATE_COLUMN,'DD-MM-YYYY')) FROM TABLE_A;

1.我收到一条错误消息,上面写着“在需要数字的地方发现了一个非数字字符”

另外,如何处理空值。如果table_A中的date_column为空,我想放置一个默认日期。

2.

SELECT MONTHS_BETWEEN(TO_DATE(SYSDATE,'DD-MM-YYYY'),TO_DATE(DATE_COLUMN,'DD-MM-YYYY')) FROM TABLE_A;

在计算日期之间的月份之后,我想用案例语句对具有日期范围的记录进行分类。

例如..如果记录集的months_between是22..我想为所有这些记录设置一个标志'0-24'..同样,如果months_between是34..我想设置一个标志'24 -48',对于所有属于此范围的记录..

4

3 回答 3

2

您无需转换sysdate为日期。尝试这个:

SELECT months_between(trunc(SYSDATE), TO_DATE(DATE_COLUMN,'DD-MM-YYYY'))

问题是 Oracle 中日期的默认格式使用月份名称。当您说to_date(sysdate, . . .)时,第一个参数将转换为字符串,然后再转换为日期。

顺便说一句,这trunc()无关紧要,但你似乎想提取一天的部分,sysdate所以我把它留在了里面。

编辑:

如果date_column已经是一个日期,只需使用:

SELECT months_between(trunc(SYSDATE), DATE_COLUMN)
于 2014-10-30T11:36:14.867 回答
2

要添加到先前的答案,您可以避免 null 像这样:

SELECT months_between(trunc(SYSDATE), nvl(TO_DATE(DATE_COLUMN,'DD-MM-YYYY'), sysdate))

如果您DATE_COLUMN的日期类型比您不需要使用TO_DATE()

所以你会得到这样的东西

SELECT months_between(trunc(SYSDATE), nvl(trunc(DATE_COLUMN), sysdate))

对于你的问题的第二部分,你可以尝试这样的事情:

SELECT 
      trunc(months_between(trunc(SYSDATE),  trunc(DATE_COLUMN))),
      (trunc(months_between(trunc(SYSDATE),  trunc(DATE_COLUMN))/24)*24)||'-'||((trunc(months_between(trunc(SYSDATE),  trunc(DATE_COLUMN))/24)*24)+24)
FROM your_table
于 2014-10-30T11:48:50.350 回答
0

如果您在 date_column 中有空值并且想要传递默认日期,则此方法有效。

select months_between(SYSDATE,coalesce(DATE_COLUMN,to_date('01-01-2014','DD-MM-YYYY'))) DIFF from TABLE_A;

于 2014-10-30T11:49:26.073 回答