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 日期时间字符串格式过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Oracle过滤和排序

当结果已被过滤以匹配我的日期格式(Oracle SQL)时,为啥这个 to_date 不起作用

oracle日期转换问题

在Oracle使用sql语句中如何插入日期格式的数据

oracle 数据库日期格式怎么只要年月日

Oracle数据库中如何将字符串格式化为日期