【问题标题】:want to substract two dates from two different tables, getting syntax error想从两个不同的表中减去两个日期,出现语法错误
【发布时间】:2019-04-29 14:00:49
【问题描述】:
select to_date(to_char(MIN (logical_date), 'YYYYMMDD'), 'YYYYMMDD')from table_1 
     - to_date(to_char(MIN (due_date) ,'YYYYMMDD'),'YYYYMMDD') FROM table_2

【问题讨论】:

  • 您的查询毫无意义。因此,您的问题也不是。请提供样本数据和期望的结果。
  • 假设我在 table_1 中有 D1 日期,在 table_2 中有 D2 日期,那么我如何找出这两个日期(D1 和 D2)的天数。如果 D1=1/05/2019 和 D2=15/05/2019 那么结果应该是 D1-D2=15
  • 您的查询结构与the legal syntax 不匹配,因此您得到一个错误并不奇怪,但说出您得到的 what 错误会很有帮助 - 在此情况,大概是“ORA-00933:SQL命令未正确结束”?
  • 单个select 语句不能有两个单独的from 子句。在学习日期算术之前,您似乎需要花更多时间了解 SQL 语句的基本元素。

标签: sql oracle oracle10g


【解决方案1】:

您可以减去两个子查询的结果,每个子查询都从其中一个表中获取最短日期;整个查询针对dual 运行(内置单行表对这类事情非常有用):

-- CTEs for your sample data
with table_1 (logical_date) as (select date '2019-05-01' from dual),
  table_2 (due_date) as (select date '2019-05-15' from dual)
-- actual query
select (select to_date(to_char(min(logical_date), 'YYYYMMDD'), 'YYYYMMDD') from table_1)
  - (select to_date(to_char(min(due_date) ,'YYYYMMDD'),'YYYYMMDD') from table_2)
  as diff
from dual;

      DIFF
----------
       -14

但是你不需要在字符串之间进行转换,你可以这样做:

select (select min(logical_date) from table_1) - (select min(due_date) from table_2) as diff
from dual;

除非您的日期包含非午夜时间部分,在这种情况下,您的结果中会得到一小部分天数;只取整整一天的结果,或者使用trunc() 将两个时间分量都设置为午夜,然后再减去——这取决于您要如何处理这些小数天。

如果您预计差值为 -15,则从结果中减去 1。如果您期望一个正值,则反转子查询的顺序,并添加一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2015-07-17
    相关资源
    最近更新 更多