【问题标题】:How to GROUP by DATE with same DATE but different time?如何按日期分组,日期相同但时间不同?
【发布时间】:2013-10-22 10:33:21
【问题描述】:

如何GROUP by DATE 相同的日期但不同的时间?

我使用此代码但出现错误:

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...

请帮忙指点。谢谢

【问题讨论】:

  • 错误是指FQA_START_DATE列,你确定它是正确的吗? BTW,FQA_START_DATE 的数据类型是什么?
  • @A.B.Cade 数据类型 I 使用 varchar。那么有什么建议吗?
  • 至于错误 - 你有一个answer。至于如何删除时间部分,您可以在将字符串转换为日期后使用TRUNC(使时间为00:00:00)或在原始字符串上使用SUBSTR。无论如何,我不会在 varchar2s 中存储日期

标签: php sql oracle


【解决方案1】:

尝试使用

GROUP BY CAST(datefield AS DATE)

【讨论】:

    【解决方案2】:

    您的内部查询在字段列表中没有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
    

    【讨论】:

    • 对于 DAY,它不是一列。我将 DAY 用于 AS。
    • 是的,但您的主查询不知道 FQA_START_DATE 字段,它只看到您的内部查询中的 DAY 和 DE_NO 字段。
    • 好的,现在我如何按 DATE 分组?将日期从 DD-Mon-YYYY HH24:MI:SS 转换为 YYYY-MM-DD?
    • @Kongkow 您的Day 字段已经是一个日期,所以只需按Day 分组
    【解决方案3】:

    你可以使用

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

    这里的 Date() 函数将日期时间转换为日期。

    date-and-time-functions.

    【讨论】:

      【解决方案4】:
      SELECT * FROM TABLE_NAME 
        WHERE DATE(coloumn_name)='SPECIFY DATE' 
        GROUP BY coloumn_name
      

      【讨论】:

        【解决方案5】:

        您可以使用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,它也是一个日期字段。

        【讨论】:

          【解决方案6】:

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

          其次,您的内联视图中的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;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-22
            • 1970-01-01
            • 2017-10-03
            • 1970-01-01
            • 2019-03-01
            • 2021-10-22
            • 1970-01-01
            • 2019-07-14
            相关资源
            最近更新 更多