-1

我在表中有以下信息,如果两个日期之间的差异> = 1,我想检索计数。

Id  testdate  exdate    
1   20120502  20120501  --> This should included, because diff is 1    
2   20120601  20120601  --> This should not included, because diff is 0    
3   20120704  20120703  --> This should included, because diff is 1    
4   20120803  20120802  --> This should included, because diff is 1

根据以上数据,我的选择计数应该返回 3。

我正在尝试以下操作,但没有给出任何结果:

select count(to_char(testdate,'YYYYMMDD')-to_char(exdate,'YYYYMMDD')) from test ;
4

3 回答 3

0
select count(*)
  from my_table
 where testdate <> exdate 

不过,您确实应该将它们转换为date数据类型……从长远来看,它可以节省很多问题。

您的查询将为您提供结果。它将返回 4。它会为您提供结果,因为只要结果testdate - exdate不为空,它将返回该行的值。

但是,由于您没有使用日期,Oracle 很可能会将这些日期转换为数字,如果您将来这样做,这将无助于日期比较。

20120901 - 20120831 = 70 -- not 1

好的,根据您的评论:

使用,如果我使用 down voteaccept select count(*) from test where to_char((testdate,'YYYYMMDD') - to_char(exdate,'YYYYMMDD')) >= 1; .但是计数是列之一。如何将上面的选择语句检索为列之一

你正在尝试完全不同的东西。

您的日期实际上是日期;发布这个很有帮助。您正在寻找一个分析函数,特别是count().

select a.*, count(*) over ( partition by 1 ) as ct
  from my_table a
 where trunc(exdate) <> trunc(testdate)

请注意该trunc函数,该函数在没有附加参数的情况下将删除日期的时间部分,这可以进行直接比较,而无需将日期转换为字符。

于 2012-09-03T18:07:45.927 回答
0
select count(*)
   from test
  where to_date(testdate,'YYYYMMDD') - to_date(exdate,'YYYYMMDD') >= 1;

或者

select count(*)
   from test
  where to_date(testdate,'YYYYMMDD') <> to_date(exdate,'YYYYMMDD');

看着testdateexdate看起来更像是列VARCHAR类型,因此您需要适当的日期转换。

于 2012-09-03T18:09:50.963 回答
0

在 Oracle 中,如果类型是日期,您可以使用它们进行计算。1 等于 1 天。1/24 等于 1 小时。

您的案例相当简单,因为您甚至可以比较字符串。

SELECT count(*)
  FROM test
 WHERE testdate <> exdate  

但听起来你希望能够是可变的,所以你宁愿将它们转换为日期然后你可以做

SELECT count(*)
  FROM test
 WHERE to_date(testdate,'YYYYMMDD')-to_date(exdate,'YYYYMMDD') >= 1

如果 testdate 减去 exdate 为 -1 或更大,我不确定你想要什么,因为 exdate 在 testdate 之后。然后你可以使用ABS

SELECT count(*)
  FROM test
 WHERE ABS(to_date(testdate,'YYYYMMDD')-to_date(exdate,'YYYYMMDD')) >= 1
于 2012-09-03T19:06:29.180 回答