【问题标题】:Finding MAX(DATE) value in SQL在 SQL 中查找 MAX(DATE) 值
【发布时间】:2015-12-10 06:30:37
【问题描述】:

我是 SQL 新手,所以这个问题-

我的表中有一个DATE 列,我的查询应该使用最新的DATE 获取值。我意识到我可以通过以下任何一种方式来实现它-

  1. SELECT TRUNC(MAX(createddatetm)) cdt FROM (SELECT TO_TIMESTAMP(TO_CHAR(createddate, 'Month dd, yyyy hh:mi AM'), 'Month dd, yyyy hh:mi AM') as createddatetm FROM comments WHERE commentid = '1234');

  2. SELECT trunc(MAX(TO_TIMESTAMP(to_char(createddate, 'Month dd, yyyy hh:mi AM'), 'Month dd, yyyy hh:mi AM'))) FROM (SELECT createddate FROM comments WHERE commentid = '1234');

  3. SELECT TRUNC(MAX(createddatetm)) cdt FROM (SELECT TO_CHAR(createddate, 'Month dd, yyyy hh:mi AM') as createddatetm FROM comments WHERE commentid = '1234');

  4. SELECT trunc(MAX(to_char(createddate, 'Month dd, yyyy hh:mi AM'))) FROM (SELECT createddate FROM comments WHERE commentid = '1234');

这是我的问题-
有没有其他更简单的方法可以实现这一目标?或者我应该使用我已经提到的任何这些?另外,这些查询在性能方面有什么区别吗?我不认为有,但我需要确认一次。

【问题讨论】:

    标签: sql oracle date greatest-n-per-group


    【解决方案1】:

    当您只是在寻找一个简单的值时,为什么要嵌套 Select 语句?

    select  trunc( max( createddate )) cdt
    from    comments
    where   commentid = '1234';
    

    【讨论】:

      【解决方案2】:

      为什么要将日期转换为 varchar 以再次将其转换回日期/时间戳?您可以只比较/使用存储在数据库中的日期值。

      使用窗口函数可以轻松解决您的问题:

      select *
      from ( 
        select c.*, 
               row_number() over (order by createddate desc) as rn
        from comments
        where commentid = 1234
      ) t
      where rn = 1;
      

      或者使用max()

      select *
      from ( 
        select c.*, 
               max(createddate) over () as max_createddate
        from comments
        where commentid = 1234
      ) t
      where max_createddate = createddate;
      

      或者如果您需要多个 commentid 值:

      select *
      from ( 
        select c.*, 
               row_number() over (partition by commentid order by createddate desc) as rn
        from comments
      ) t
      where rn = 1;
      

      【讨论】:

      • 我将日期转换为 varchar 以再次将其转换回日期/时间戳的原因是我希望也可以根据日期时间进行比较,但不使用要显示的值?
      • 比较将总是使用日期/时间值进行。如果要在显示期间隐藏时间部分,请使用 to_char() 格式化 date 列。但最好在查询中检索“真实”值并在您的应用程序(前端)中进行格式化。
      猜你喜欢
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多