如何在DATE按相同的DATE但不同的时间进行分组?

时间:2013-10-22 10:33:21

标签: php sql oracle

如何在DATE GROUP使用相同的日期但不同的时间?

我使用此代码但收到错误:

SELECT TO_CHAR(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS'),'YYYY-MM-DD') DAY, DE_NO
FROM (
 SELECT TO_CHAR(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS'),'YYYY-MM-DD') DAY, DE_NO
 FROM PACKINGAPPS_FQA
WHERE (TO_CHAR(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS'),'YYYY-MM-DD') BETWEEN '$start_date' AND '$end_date')
)
GROUP BY DAY, DE_NO

错误是:

Warning: oci_execute() [function.oci-execute]: ORA-00904: "FQA_START_DATE": invalid identifier in...

请帮助建议。感谢

6 个答案:

答案 0 :(得分:1)

尝试使用

GROUP BY CAST(datefield AS DATE)

答案 1 :(得分:1)

您的内部查询在字段列表中没有FQA_START_DATE,因此您的第一个SELECT不正确。

试试这个

SELECT DAY, DE_NO
FROM (
 SELECT TO_CHAR(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS'),'YYYY-MM-DD') 
   DAY, 
   DE_NO
 FROM PACKINGAPPS_FQA
WHERE (TO_CHAR(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS'),'YYYY-MM-DD') 
         BETWEEN '$start_date' AND '$end_date')
)
GROUP BY DAY, DE_NO

答案 2 :(得分:0)

SELECT * FROM TABLE_NAME 
  WHERE DATE(coloumn_name)='SPECIFY DATE' 
  GROUP BY coloumn_name

答案 3 :(得分:0)

你可以使用

SELECT field_name(s) FROM table_name GROUP BY DATE(date_field);

此处Date()函数将为date datetime to date。

date-and-time-functions

答案 4 :(得分:0)

您可以使用TRUNC功能获取日期的一部分(没有时间)。 TRUNC将删除时间部分。

结果值仍然是一个日期,您可以使用它进行分组并按原样格式化。

我必须承认,我不清楚FQA_START_DATE字段的值是什么类型以及输入变量是什么类型。看起来它们都是字符串,但我建议您将日期存储为日期,并尽可能使用日期输入参数。

理想情况下,您的查询将如下所示:

SELECT 
  FQA_START_DATE_WITHOUT_TIME, 
  DE_NO
FROM (
 SELECT 
   trunc(FQA_START_DATE) as FQA_START_DATE_WITHOUT_TIME, 
   DE_NO
 FROM P
   ACKINGAPPS_FQA
 WHERE 
   trunc(FQA_START_DATE) BETWEEN $start_date AND $end_date
)
GROUP BY 
  FQA_START_DATE_WITHOUT_TIME, 
  DE_NO

如果您不需要任何其他字段,额外的连接或聚合,您可以将其简化为:

SELECT DISTINCT /* Distinct will remove duplicate rows */
  trunc(FQA_START_DATE) as FQA_START_DATE_WITHOUT_TIME, 
  DE_NO
FROM P
  ACKINGAPPS_FQA
WHERE 
  trunc(FQA_START_DATE) BETWEEN $start_date AND $end_date

请注意,这假定FQA_START_DATE为日期/日期时间字段,假设start_dateend_date为日期/日期时间,并返回字段FQA_START_DATE_WITHOUT_TIME,这是也是一个日期字段。

答案 5 :(得分:0)

首先,您的内联视图中没有任何带有别名FQA_START_DATE的列(SELECT子句中的FROM语句)。您可能在基表中有一个具有该名称的列,但这不在此处,因为您从内联视图SELECT而不是基表。

其次,内联视图中的WHERE条件已经完全狂暴,并且当您将字符值与两个字符值进行比较时,它会返回所有错误的结果。

我建议您使用以下查询:

  SELECT TRUNC(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS')) AS dt, de_no
    FROM packingapps_fqa
   WHERE TRUNC(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS'))
         BETWEEN TRUNC (TO_DATE('$start_date')) AND TRUNC(TO_DATE('$end_date'))
GROUP BY TRUNC(TO_DATE(FQA_START_DATE,'DD-Mon-YYYY HH24:MI:SS')), de_no;