【问题标题】:Alternate for function Timestamp替代功能时间戳
【发布时间】:2017-09-08 16:07:58
【问题描述】:

我想修改下面的查询以避免使用函数 Timestamp。由于正在使用此功能,因此未使用索引。请让我知道可以使用哪些替代品。此查询适用于 DB2 数据库。

SELECT *                  
  FROM   Capacity CPC          
 WHERE TIMESTAMP(CPC.CPC_DATE,CPC_TIME) BETWEEN            
       CURRENT TIMESTAMP + :Input_number HOURS
   AND                                                   
       CURRENT TIMESTAMP + :Input_number HOURS

【问题讨论】:

  • 我认为您最好的选择是创建一个带有索引的计算 TIMESTAMP 列,或者如果您的 DB2 版本支持,则创建一个功能索引。
  • 旁注:请never use BETWEEN for date/time types (帖子谈到SQL Server,但根本问题实际上与平台无关)。如果您对查询进行分页,这里主要关注的是获得相同的结果。日期/时间类型是正的、连续范围的类型,应始终使用独占上限 (<) 进行查询

标签: sql timestamp db2


【解决方案1】:

您必须分别分解日期范围和时间范围。如果时间部分在范围的同一日期部分,则只需要检查它:

SELECT *
FROM Capacity CPC
WHERE 
CPC_DATE >= DATE(CURRENT TIMESTAMP - :Input_number HOUR)
AND
CPC_DATE <= DATE(CURRENT TIMESTAMP + :Input_number HOUR)
AND
CPC_TIME >= 
    CASE WHEN CPC_DATE = DATE(CURRENT TIMESTAMP - :Input_number HOUR)
      THEN TIME(CURRENT TIMESTAMP - :Input_number HOUR)
      ELSE '00:00:00'   
    END
AND 
CPC_TIME <= 
    CASE WHEN CPC_DATE = DATE(CURRENT TIMESTAMP + :Input_number HOUR)
      THEN TIME(CURRENT TIMESTAMP + :Input_number HOUR)
      ELSE '24:00:00' 
    END

【讨论】:

  • 请不要将BETWEEN 用于正的连续范围类型(​​如日期/时间);如果这个查询是按小时分页的,你最终会选择双方最后一小时内的东西。
【解决方案2】:

由于您的数据不在 2NF 中,这几乎没有希望:CPC_DATECPC_TIME 应该是单列 CPC_DATETIME。如果您不需要该形式的时间组件,您仍然可以从YYYY-MM-DD-00:00:00 查询到(YYYY-MM-DD plus one day minus one second) 并使用索引保留。

【讨论】:

  • “几乎没有希望”?我认为不会。
猜你喜欢
  • 1970-01-01
  • 2013-09-04
  • 2011-02-21
  • 2012-10-10
  • 1970-01-01
  • 2016-03-21
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多