2016-11-15 16 views
0

当我尝试此查询:如何执行double to_char?

SELECT EQUIPA,COUNT(*) TOTAL, to_char(DATAD, 'YY.MM.DD') Data FROM 
    (
     SELECT EQUIPA, to_char(OS_DATACONCLUSAO,'YY.MM.DD HH24') DATAD 

     FROM OS_CRM_DB_FINAL 

     WHERE USERFECHO IS NOT null AND (EQUIPA = 'AAA') AND (to_char(OS_DATACONCLUSAO,'YY.MM.DD HH24') >= '16.11.03 17:07') AND (to_char(OS_DATACONCLUSAO,'YY.MM.DD HH24') <= '16.11.15 17:07') 

     ORDER BY DATAD DESC 
) GROUP BY EQUIPA, Data 
; 

我得到这个错误:

  1. 00000 - "invalid number"

我在做什么错?谢谢

+1

你不能 - 你需要转换回日期然后回到一个字符,或者你需要对字符串进行字符串处理以获得你需要的结果。我更喜欢第一到第二,因为它更明显。 – Ben

+1

尝试将字符串转换为字符串不计算。改用一个子串。 –

回答

1

我没有检查内部查询的正确性 - 你没有提供测试数据,我不打算自己创建。但是:如果它是正确的,则只需在内部查询(“子查询”)中选择OS_DATACONCLUSAO,而不是其字符串表示形式。 (您仍然使用WHERE子句中的字符串表示形式,而不是在SELECT中。)

试试看看它是否有效。然后我们可以讨论你在WHERE条款中有什么;它可能是不正确的(日期不应该作为字符串比较),即使它是正确的,它也是非常低效的。为了比较正确,您应该将您正在比较的字符串转换为to_date()的日期,而不是将日期值转换为字符串。

1

您试图按data进行分组,这是在同一级别的查询中定义的列别名,因此将生成ORA-00904: "DATA": invalid identifier

您正在将日期转换为字符串(出于某种原因,为两位数字年)并与另一个字符串进行比较,无论如何这不是一个好主意 - 如果日期列被索引,则将其转换为字符串可防止索引用于比较,通常比较原始数据类型更有意义,效率更高。但字符串以不同的格式结束 - 一个有几分钟,另一个不是。

您的内部查询将日期转换为字符串,并对结果进行排序;这表明这是您现在正试图总结的现有查询。顺序是毫无意义的,不会影响外部查询中结果的顺序。

如果你真的想坚持一个字符串中的内部查询,你可以使用一个子,只要日期格式是合适的,并使用该子串组,由太:

SELECT EQUIPA, COUNT(*) TOTAL, substr(DATAD, 1, 8) Data FROM 
    (
     ... -- original inner query 
) GROUP BY EQUIPA, substr(DATAD, 1, 8) 

或转换回一个日期,然后为一个字符串又和组由太,这是做更多的工作比你需要的,但在逻辑上是在使用转换后的日期是什么您最初试图做的事:

SELECT EQUIPA, COUNT(*) TOTAL, 
    to_char(to_date(DATAD, 'YY.MM.DD HH24'), 'YY.MM.DD') Data FROM 
    (
    ... -- original inner query 
) GROUP BY EQUIPA, to_date(DATAD, 'YY.MM.DD HH24') 

或更改内部查询以返回原始日期而不是字符串;尽管内部查询根本不需要:

SELECT EQUIPA, COUNT(*) TOTAL, to_char(TRUNC(OS_DATACONCLUSAO), 'YY.MM.DD') Data 
FROM OS_CRM_DB_FINAL 
WHERE USERFECHO IS NOT null 
AND EQUIPA = 'AAA' 
AND OS_DATACONCLUSAO >= TO_DATE('2016.11.03 17:07:00', 'YYYY.MM.DD HH24:MI:SS') 
AND OS_DATACONCLUSAO <= TO_DATE('2016.11.15 17:07:00', 'YYYY.MM.DD HH24:MI:SS') 
GROUP BY EQUIPA, TRUNC(OS_DATACONCLUSAO) 
ORDER BY EQUIPA, TRUNC(OS_DATACONCLUSAO) DESC 

我已经更改了过滤器来比较日期而不是字符串。日期只在最后一刻转换为字符串才能显示。另请注意,我已按截断日期排序(默认情况下,该日期会将时间设置为午夜)。您可以在顺序中使用data列别名(但不会在其他地方),在这种情况下,它可以正常使用;但是如果您在结果集中设置了不同的日期格式,例如MM/DD/YYYY你想按日期排序而不是字符串。