案件陈述书中的比较日期

时间:2019-08-01 17:04:30

标签: oracle plsql

我无法比较案例说明中的日期

  

ORA-00932:数据类型不一致:预期的CHAR在DATE得到了   00932。00000-“数据类型不一致:预期的%s得到了%s”   *原因:
  *动作:

在这里,我想将enter code here START_DATE_ACTIVE小于PROJECT_START_DATE的情况下用PROJECT_START_DATE替换。

Please refer the data here

(
CASE WHEN TO_DATE(PPP.START_DATE_ACTIVE,'DD/MM/YY') < 
TO_DATE(TO_CHAR(TO_DATE(PPA.PROJECT_START_DATE,'yyyy/mm/dd'),'DD-MM- 
  YY'),'DD/MM/YY')
   THEN PPA.PROJECT_START_DATE
   ELSE PPP.START_DATE_ACTIVE
END
)                                          START_DATE_ACTIVE

预期结果

Expected Result

3 个答案:

答案 0 :(得分:1)

如果您的日期实际上存储在日期字段中,则不必将其转换为字符,就可以将它们作为日期进行测试。

(
 CASE WHEN PPP.START_DATE_ACTIVE < PPA.PROJECT_START_DATE
   THEN PPA.PROJECT_START_DATE
   ELSE PPP.START_DATE_ACTIVE
END
)   START_DATE_ACTIVE

答案 1 :(得分:0)

正如其他人指出的那样,一旦日期正确包含在DATE类型中,就无需使用to_date或to_char来执行数据操作。这些例程仅是从/向人类可读形式转换所必需的。但这可能不是全部。 Oracle DATE类型包含日期和时间部分。似乎多次转换通常是尝试删除时间成分。但这不是必需的。可以使用trunc功能(实际上将时间设置为00:00:00)。如果是这种情况,您只需要日期部分,那么您的case语句将减少为

case
    when trunc(ppp.start_date_active) < trunc(ppa.project_start_date)
    then trunc(ppa.project_start_date)
    else trunc(ppp.start_date_active)
end start_date_active; 

但是可以将其简化为以下一行:

trunc(greatest(start_date_active,project_start_date)) start_date_active 

答案 2 :(得分:-1)

答案:

(CASE WHEN TO_DATE (PPP.START_DATE_ACTIVE,'DD/MM/YY') < 
 TO_DATE (TO_CHAR(TO_DATE(PPA.PROJECT_START_DATE,'yyyy/mm/dd'),'DD-MM-YY'),'DD/MM/YY')
 THEN TO_DATE (TO_CHAR(TO_DATE(PPA.PROJECT_START_DATE,'yyyy/mm/dd'),'DD-MM-YY'),'DD/MM/YY')
 ELSE TO_DATE (PPP.START_DATE_ACTIVE,'DD/MM/YY')
 END

结果字段日期格式应与您的比较日期格式相同。