【问题标题】:Preventing Max function from using timestamp as part of criteria on a date column in PL/SQL防止 Max 函数使用时间戳作为 PL/SQL 中日期列标准的一部分
【发布时间】:2011-06-07 20:39:40
【问题描述】:

如果我查询:

select max(date_created) date_created

在 PL/SQL (Oracle 11g) 中的日期字段上,并且有在同一日期但在不同时间创建的记录,Max() 仅返回该日期的最新时间。我想做的是忽略时间并返回与最大日期匹配的所有记录,而不管它们在该列中的相关时间戳如何。这样做的最佳做法是什么?

编辑:我要做的是返回符合我的条件的最近日期的所有记录,而不管当天的时间戳如何。以下是我现在正在做的事情,它只返回该日期最新日期和时间的记录。

    SELECT r."ID",
    r."DATE_CREATED"
  FROM schema.survey_response r
  JOIN
    (SELECT S.CUSTOMERID ,
      MAX (S.DATE_CREATED) date_created
    FROM schema.SURVEY_RESPONSE s
    WHERE S.CATEGORY IN ('Yellow', 'Blue','Green')
    GROUP BY CUSTOMERID
    ) recs
  ON R.CUSTOMERID    = recs.CUSTOMERID
  AND R.DATE_CREATED = recs.date_created
  WHERE R.CATEGORY  IN ('Yellow', 'Blue','Green')

最终编辑:通过下面的查询让它工作。

SELECT r."ID",
    r."DATE_CREATED"
  FROM schema.survey_response r
  JOIN
    (SELECT S.CUSTOMERID ,
      MAX (trunc(S.DATE_CREATED)) date_created
    FROM schema.SURVEY_RESPONSE s
    WHERE S.CATEGORY IN ('Yellow', 'Blue','Green')
    GROUP BY CUSTOMERID
    ) recs
  ON R.CUSTOMERID    = recs.CUSTOMERID
  AND trunc(R.DATE_CREATED) = recs.date_created
  WHERE R.CATEGORY  IN ('Yellow', 'Blue','Green')

【问题讨论】:

  • WHAT 数据库 - WHICH 版本.....
  • MAX 只返回单个标量值(因此忽略日期时间字段的非日期部分是不相关的)。考虑更新帖子以提出真正的问题,例如“如何选择最近一天的所有记录?” (或者什么是合适的——这些知识也将导致更好的 SO 搜索,因为这个问题很“常见”。)
  • 我很抱歉,更多信息是为了。这实际上是一个 PL/SQL 查询,是的,我需要选择最近一天的所有记录。这是针对 Oracle 11g 的。已添加标签。

标签: datetime plsql oracle11g max truncate


【解决方案1】:

在Oracle中,您可以忽略时间获取最新日期

SELECT max( trunc( date_created ) ) date_created
  FROM your_table

您可以通过多种方式获取具有最新日期而忽略时间的所有行。使用解析函数(推荐)

SELECT *
  FROM (SELECT a.*,
               rank() over (order by trunc(date_created) desc) rnk
          FROM your_table a) 
 WHERE rnk = 1

或更传统但效率较低的

SELECT *
  FROM your_table
 WHERE trunc(date_created) = (SELECT max( trunc(date_created) )
                                FROM your_table)

【讨论】:

  • 将第一个块插入查询时返回 0 条记录。我什至不敢尝试弄清楚如何将第二和第三块合并到我的查询中。 SELECT r."ID", r."DATE_CREATED" FROM schema.survey_response r JOIN (SELECT S.CUSTOMERID , MAX (S.DATE_CREATED) date_created FROM schema.SURVEY_RESPONSE s WHERE S.CATEGORY IN ('Yellow', 'Blue','Green') GROUP BY CUSTOMERID ) recs ON R.CUSTOMERID = recs.CUSTOMERID AND R.DATE_CREATED = recs.date_created WHERE R.CATEGORY IN ('Yellow', 'Blue','Green')
  • 搞定了!我忽略了将 trunc() 包裹在 r.date_created 的连接标准周围,以与我对 Max() 操作所做的截断相一致。已更新我原始问题中的最终有效查询。谢谢!!
猜你喜欢
  • 2017-12-12
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2016-10-24
相关资源
最近更新 更多