【问题标题】:SQL Oracle datetime string format filterSQL Oracle 日期时间字符串格式过滤器
【发布时间】: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 

【问题讨论】:

    标签: sql oracle datetime-format


    【解决方案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”。请告知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多