SQL Oracle 日期时间字符串格式过滤器
Posted
技术标签:
【中文标题】SQL Oracle 日期时间字符串格式过滤器【英文标题】:SQL Oracle datetime string format filter 【发布时间】:2014-04-01 14:05:02 【问题描述】:在 oracle 中,我有一个名为 Ship 的表,如下所示;
日期和时间以字符串格式显示在单个列中。
f_ID f_type f_date
1001 A 3/30/14 12:00:44 PM
1001 B 3/30/14 10:05:45 AM
1002 A 2/4/14 11:31:11 AM
1002 B 2/3/14 9:43:21 AM
1003 A 2/3/14 9:37:04 AM
1003 B 12/13/14 10:13:43 AM
1004 A 2/3/14 10:49:50 AM
1005 B 2/3/14 11:00:43 AM
1006 A 2/3/13 11:02:28 AM
1006 B 2/3/14 11:07:23 AM
1006 C 2/3/14 9:19:11 AM
1007 A 2/4/14 11:32:30 AM
1007 B 2/4/14 11:32:30 AM
1007 C 2/4/14 11:32:30 AM
1007 D 2/4/14 11:32:30 AM
我希望查询/列出只有每条记录的确切日期的 ID (f_ID
),但时间戳可以不同。
如何在 Oracle 中查询?由于日期和时间合并在一个列中,我很难查询。
结果应该是
f_ID f_type f_date
1001 A 3/30/14
1001 B 3/30/14
1004 A 2/3/14
1005 B 2/3/14
1007 A 2/4/14
1007 B 2/4/14
1007 C 2/4/14
1007 D 2/4/14
【问题讨论】:
【参考方案1】:要获取s_id
和日期的列表,请使用带有having
子句的聚合:
select s.s_id, trunc(date), count(*)
from ship s
group by s.s_id, trunc(date)
having min(date) <> max(date)
编辑:
如果您的日期是一个字符串,那么您应该修复数据。你的格式很糟糕。如果您必须将日期存储为字符串,总是使用 ISO 标准 YYYY-MM-DD HH:MI:SS 格式(或类似格式)。但你仍然可以为所欲为:
select s.s_id, substr(date, 1, instr(date, ' ')), count(*)
from ship s
group by s.s_id, substr(date, 1, instr(date, ' '))
having min(date) <> max(date)
【讨论】:
在 TRUNC(date) 的第 3 行显示“ORA-01722: invalid number”。我正在使用 taod。 您的日期不是以日期时间格式存储的吗?是字符串吗? 不幸的是,它是一个字符串。 你能解释一下 min(date) max(date) 的逻辑吗? @奇诺。 . .您希望时间戳不同。因此,这会检查“日期”值(包含时间戳)在给定日期至少有两个不同的值。【参考方案2】:您可以使用TRUNC
函数忽略时间:
SELECT fdid
FROM ship
WHERE TRUNC(ship.date_field) = SOME_DATE;
如果您只想获取所有可能的日期:
SELECT DISTINCT(TRUNC(date_field))
FROM ship;
【讨论】:
感谢 pablomatico。但我希望列出所有可能的日期。我该怎么做? 只有可能的日期? 所有可能的日期, 请允许我进一步解释;我只想列出所有日期相同的 ID,结果应该是 f_ID f_type f_date 1001 A 3/30/14 1001 B 3/30/14 1004 A 2/3/14 1005 B 2/3/14 1007 A 2/4/14 1007 B 2/4/14 1007 C 2/4/14 1007 D 2/4/14【参考方案3】:我愿意:
select f_ID, f_type, trunc(f_date) f_date
from Ship
order by f_date;
这将允许您检测具有相同日期的行,无论时间戳如何。
【讨论】:
我不明白 dday。请查看我编辑的帖子,其中我在查询后显示了预期的结果。 查看我的编辑,现在应该可以了。实际上,dday 只是一个列别名(我用 dday 代替了 Oracle 中的保留关键字 day)。 我在 TRUNC 上收到以下错误“ORA-00900:无效的 SQL 语句”。我在 oracle 上使用 toad。 很抱歉,同一张表上的这个确切查询给了我正确的结果...你确定你执行的是完全相同的查询吗?【参考方案4】:这应该可以满足您的需要:
Select f_id, f_type, SubStr(f_date, 1, InStr(f_date, ' '))
From Ship s
Where Exists( Select 1
From Ship x
Where SubStr(s.f_date, 1, InStr(s.f_date, ' ')) =
SubStr(x.f_date, 1, InStr(x.f_date, ' '))
And s.f_date <> x.f_date )
Order By f_id, f_type
【讨论】:
感谢 Matheus,我正在使用 taod for oracle,它在第 5 行为 Trunc(x.f_date) 提供了以下错误“ORA-01722: invalid number”。请告知。以上是关于SQL Oracle 日期时间字符串格式过滤器的主要内容,如果未能解决你的问题,请参考以下文章