我在一个字段中有一个表格(其中包括日期)。
我需要获取所有列表的列表,这些列表比最早的日期更早,比最新的日期更早并且在表格中完全丢失。
因此,如果表包含:
2012-01-02
2012-01-02
2012-01-03
2012-01-05
2012-01-05
2012-01-07
2012-01-08
我想要一个返回的查询:
2012-01-04
2012-01-06
这样的事情(假设您的表被命名your_table
,而date列被命名the_date
):
with date_range as (
select min(the_date) as oldest,
max(the_date) as recent,
max(the_date) - min(the_date) as total_days
from your_table
),
all_dates as (
select oldest + level - 1 as a_date
from date_range
connect by level <= (select total_days from date_range)
)
select ad.a_date
from all_dates ad
left join your_table yt on ad.a_date = yt.the_date
where yt.the_date is null
order by ad.a_date;
编辑:
该WITH
子句称为“公用表表达式”,等效于派生表(“内联视图”)。
类似于
select *
from (
.....
) all_dates
join your_table ...
第二个CTE使用Oracleconnect by
实现中未记录的功能简单地“即时”创建日期列表。
与使用派生表相比,重新使用选择(就像我计算第一个和最后一个日期所做的那样)要容易一些(恕我直言,更易读)。
编辑2:
这也可以通过递归CTE来完成:
with date_range as (
select min(the_date) as oldest,
max(the_date) as recent,
max(the_date) - min(the_date) as total_days
from your_table
),
all_dates (a_date, lvl) as (
select oldest as a_date, 1 as lvl
from date_range
union all
select (select oldest from date_range) + lvl, lvl + 1
from all_dates
where lvl < (select total_days from date_range)
)
select ad.a_date, lvl
from all_dates ad
left join your_table yt on ad.a_date = yt.the_date
where yt.the_date is null
order by ad.a_date;
哪个应该在所有支持递归CTE的DBMS中都起作用(PostgreSQL和Firebird-更符合标准-确实需要recursive
关键字)。
请注意select (select oldest from date_range) + lvl, lvl + 1
递归部分中的hack
。这不是必须的,但是在递归CTE中,Oracle在DATE方面仍然存在一些错误。在PostgreSQL中,以下工作没有问题:
....
all_dates (a_date, lvl) as (
select oldest as a_date, 0 as lvl
from date_range
union all
select a_date + 1, lvl + 1
from all_dates
where lvl < (select total_days from date_range)
)
....
我试图选择头衔、姓氏、出生日期和头衔为“销售代表”并且他们出生在1950年之前或之后的国家。 当a把日期放在代码中时,它会给我一个错误。 我认为这是正确的: 它给ORA-01843的错误:不是有效的月份 如果你能帮助我,谢谢你。 以下是表格的示例数据:
问题内容: 我有一个像这样的Oracle SELECT查询: 我的意思是,我想选择字段“ date_enter”今天所在的所有位置。我已经尝试过类似的操作,但是没有用。 忠告: 我不能使用TO_CHAR,因为它变得太慢。 问题答案: 假设是一个字段: 默认情况下,该功能会删除时间部分,因此您可以在今天早晨午夜12点前使用该功能。 如果您特别想坚持使用,而不是,则可以执行以下操作: 是包容性的,因此
问题内容: 我有以下数据: 我正在尝试编写一个查询,该查询选择与某个日期匹配的所有记录,但是我正在为该字段使用时间戳记,无论我如何尝试,我的查询都不会产生任何结果。 SQL :我尝试了以下查询,但没有任何结果 1。 2。 3。 仅当我将整个日期值设置为时,它才起作用; 问题答案: 尼古拉斯·克拉斯诺夫(Nicholas Krasnov)提供的答案
问题内容: 我正在使用Oracle数据库,并且我有一个表,该表具有2列,其数据如下所示: 我想知道看到每个哈希的时间窗口。像 到目前为止,我基本上是这样的: 这几乎可行,但是在2017-11-01开始到2017-11-09结束时,它会给我像“ abcd”一样,“隐藏”它在中间切换的事实。 是否可以通过连续的日期/时间“块”将这些结果分组? 问题答案: 看起来像是“缺口和孤岛”问题: DBFiddl
问题内容: 请注意,以下组的输出中缺少和月份。如果一个月没有数据,我想显示月份和。有人知道该怎么做吗? 样本数据: 仍然无法清除丢失的行,这是我在其中的位置。 问题答案: 如果您不希望超出结果的日期和日期,则可以执行以下操作:
问题内容: 我有这个查询 引发ORA-00936缺少表达式的allow查询有什么问题?任何人?任何帮助将不胜感激…在第一个顺序的开头处,列:80处引发错误: 问题答案: 您的查询可以大大简化。它具有诸如子查询的额外层和在子查询中不必要的东西。您想做什么就可以: