在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
答案 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