【问题标题】:Selecting products that haven't been made in 2 years选择2年未生产的产品
【发布时间】:2010-02-10 08:41:59
【问题描述】:

我正在努力获得过去 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

我想要至少在过去 2 年内生产过的所有产品。

我希望这能解决问题。

【问题讨论】:

  • 您能告诉我们您的架构是什么样的吗?
  • 你的桌子怎么样?
  • 嗯,我真的不确定。我知道它只是在一张桌子上,所以你应该可以在这张桌子上的日期之外做,对吧?
  • 说只有 2 列 id 和 date。
  • 您能否提供更多关于oldernewer 列的用途的信息?您可以使用ADD_MONTHS(SYSDATE, -24) 获取两年前的日期。

标签: sql oracle


【解决方案1】:

用 HAVING 分组

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

【讨论】:

  • 这似乎可行。你能向我解释一下它是如何工作的吗?您正在选择最近日期小于 2 年前的最近日期?那应该是从表组中选择 id,max(date) by id 具有 date
  • 因为您想知道 LATEST 日期是在两年前之前的时间。最大值为最新日期。
【解决方案2】:

我会使用 SQL 的 dateadd 函数。

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

将是一个 where 子句,它将选择日期距当前日期不到 2 年的记录。

希望对您有所帮助。

编辑:如果您想按天计算,请使用 dateadd(d,-740,getdate())

【讨论】:

  • DATEADD 在 Oracle 中不存在,ADD_MONTHS(SYSDATE, -24) 等价。
  • 很公平。我在问题中看到了 SQL 标记。谢谢。
  • 这是我当时讨厌 IBM 的一个小行为,当它发生时也讨厌 Microsoft:使用常用词和短语来指定特定产品。有 IBM 个人计算机、Microsoft SQL Server、两种不同的磁盘操作系统(提示:我最初熟悉的那个是在 360 上运行的)等等。
【解决方案3】:

也许是这样的?

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

【讨论】:

  • 猜猜这会返回超过 2 年前产生的 id,但不会删除过去两年内没有产生的那些。
【解决方案4】:
SELECT id FROM table WHERE date + (365*2) <= sysdate;

如果您需要同时获取它们,请使用SELECT id, date, other, columns ...

【讨论】:

  • 猜猜这将返回超过 2 年以前产生的 id,但不会删除过去两年内没有产生的那些。还要小心闰年。
猜你喜欢
  • 2015-05-03
  • 1970-01-01
  • 2015-02-19
  • 2021-07-30
  • 2019-02-26
  • 2018-04-26
  • 2011-02-05
  • 2015-03-02
  • 1970-01-01
相关资源
最近更新 更多