SQL Oracle日期时间字符串格式过滤器

时间:2014-04-01 14:05:03

标签: sql oracle datetime-format

在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 

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我愿意:

select f_ID, f_type, trunc(f_date) f_date
from Ship
order by f_date;

这将允许您检测具有相同日期的行,无论时间戳如何。

答案 2 :(得分:0)

您可以使用TRUNC功能忽略时间:

SELECT fdid
FROM ship
WHERE TRUNC(ship.date_field) = SOME_DATE;

如果您只想获得所有可能的日期:

SELECT DISTINCT(TRUNC(date_field))
FROM ship;

答案 3 :(得分:0)

这应该做你需要的:

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