2010-02-09 56 views
1

我正在试图获得在过去2年内未生产的产品。我用SQL不太好,但这是我开始使用的,它不起作用。选择两年内还没有生产的产品

比方说在这个例子中,我的模式看起来像这样

PROD_ID,DATE_CREATED,num_units_created。

我会采取我可以得到的任何建议。

select id, (select date from table 
      where date <= sysdate - 740) older, 
      (select date from table 
      where date >= sysdate - 740) newer 
from table 
where newer - older 

我不够清楚。

基本上我想要所有在过去的2年里都没有生产过的产品。无论何时生产产品,都会添加一条生产线。所以,如果我只是做sysdate < = 740,它只会给我所有从2年前开始生产的产品。

我希望所有在过去2年内至少生产过一次的产品。

我希望清除它。

+1

你能告诉我们你的架构是什么样子? – 2010-02-09 22:33:05

+0

你的桌子是怎样的? – 2010-02-09 22:33:16

+0

嗯我真的不确定。我知道这只是一张桌子,所以你应该能够在该桌子的日期之前完成吧? – Catfish 2010-02-09 22:34:30

回答

3

我会使用SQL的dateadd函数。

where date < dateadd(year,-2,getdate()) 

将是会选择与最新记录不是从当前日起2年以下的where子句。

希望有所帮助。

编辑:如果您想通过天的时候,使用DATEADD(d,-740,GETDATE())

+3

Oracle中不存在DATEADD,'ADD_MONTHS(SYSDATE,-24)'是等效的。 – 2010-02-09 22:38:29

+0

够公平的。我在问题中看到了SQL标签。谢谢。 – Aaron 2010-02-09 22:40:10

+0

这是我在当天讨厌IBM的一个小小行为,并且在发生这种情况时憎恶微软:选择常用词汇和短语来指定特定产品。有IBM个人计算机,Microsoft SQL Server,两种不同的磁盘操作系统(提示:我最初熟悉的那个在360上运行),等等。 – 2010-02-09 22:49:14

0

也许这样的事情?

select id, date 
from table 
where date <= (sysdate - 730); 
+0

猜测这会返回两年前已生成的id,但不会删除那些在过去两年内未生成的id。 – 2010-02-09 22:55:54

0
SELECT id FROM table WHERE date + (365*2) <= sysdate; 

使用SELECT id, date, other, columns ...如果你需要在同一时间得到它们。

+0

猜测这会返回2年前生成的id,但不会删除那些在过去两年内未生成的id。还要小心闰年。 – 2010-02-09 22:56:37

6

集团通过与具有

select id, max(date) 
from table 
group by id 
having max(date) < add_months(sysdate,-24) 
+0

+1正确和最简单的解决方案。 – APC 2010-02-10 06:07:24

+0

这看起来好像会起作用。你能向我解释它是如何工作的吗? 您正在选择最近日期少于2年前的最近日期? 这应该是选择ID,最大(日期)从表组ID,具有日期 Catfish 2010-02-10 17:23:26

+0

因为你想知道最近的日期是在两年前。最大值是最新的日期。 – 2010-02-10 21:38:08