【问题标题】:How to substruct dates in oracle db? [duplicate]如何在 oracle db 中减去日期? [复制]
【发布时间】:2021-04-27 07:38:59
【问题描述】:

我想子结构 2 个日期(当前日期和 hairdressing_date)以从表中获取结果以表示过去 2 年的数据。 我有以下 SELECT 语句:

SELECT count(c_id) 
  INTO counter 
  FROM RESERVATIONS r
 WHERE r.customer_id = 1 
   AND (Sysdate - r.hairdressing_date) / 365 < 2;

这是自定义的,但我不确定代码中的“/365”部分。

如何正确获取所需数据? 你能写出这行的正确实现吗?

【问题讨论】:

  • 不幸的是,这已被标记为带有问题的重复项,因此无法给出新答案,但链接的问题不在过滤器的上下文中。您应该知道,最好不要对要过滤的列使用函数 - 这意味着需要为与其他过滤器匹配的每一行评估表达式,这需要工作并且意味着不会使用简单的索引(并且优化器将很难估计基数)。在这种情况下:r.hairdressing_date &gt; add_months(sysdate,-24) 可能是你真正想要的

标签: sql oracle date


【解决方案1】:

请像这样使用MONTHS_BETWEEN()函数:

SELECT MONTHS_BETWEEN(TRUNC(SYSDATE), TO_DATE('22.01.2019', 'DD.MM.YYYY'))/12 
  FROM DUAL;

考虑到你的情况,再回到这个:

SELECT count(c_id) 
  INTO counter 
  FROM RESERVATIONS r     
 WHERE r.customer_id = 1 
   AND MONTHS_BETWEEN(TRUNC(SYSDATE), hairdressing_date)/12 < 2;

【讨论】:

  • FROM DUAL 是什么意思?我应该怎么做比较 "> 2" ?
  • SELECT count(c_id) INTO counter FROM RESERVATIONS r WHERE r.customer_id = 1 AND MONTHS_BETWEEN(TRUNC(SYSDATE), hairdressing_date)/12 &lt; 2;
  • 感谢您的帮助
  • @andrew17 请将答案标记为已接受
猜你喜欢
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多