MONTHS_BETWEEN错误并创建标志

时间:2014-10-30 11:35:05

标签: sql oracle sql-date-functions

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'

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

答案 2 :(得分:0)

如果你在date_column中有空值并希望传递默认日期,那么这是有效的。

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