【问题标题】:Converting char-date-char转换 char-date-char
【发布时间】:2012-03-12 11:51:30
【问题描述】:

该列被定义为 VARCHAR。 本栏目数据:

2012-03-11 12:10:00.0 IST

我只想获取日期部分。
最好的方法是什么?

我厌倦了将其转换为日期:

to_char(to_date('2012-03-11 12:10:00.0 IST', 'YYYY-MM-DD'),'YYYY-MM-DD')

但出现错误:日期格式图片在转换整个输入字符串之前结束

【问题讨论】:

  • 为什么在 varchar 列中有日期/时间数据?为什么没有日期时间列呢?
  • 它确实结束了,您的 varchar2 列不会在 DD 处停止,请参阅 techonthenet.com/oracle/functions/to_date.php
  • @kenny - 你想要什么DATE?由于 Oracle DATE 既没有时区也没有小数秒,当您将数据转换为 DATE 时是否要忽略这两者?还是要将时间转换为标准时区(即 GMT/UTC)?您确定不想将字符串转换为支持小数秒和时区的TIMESTAMP WITH TIME ZONE

标签: sql oracle


【解决方案1】:

更新:如果我猜对了,您只想要日期 part不转换 日期? 然后这样做:

select SUBSTR('2012-03-11 12:10:00.0 IST', 1, 10)

如果您还想将其转换为日期,请执行以下操作:

select to_date(SUBSTR('2012-03-11 12:10:00.0 IST', 1, 10))

【讨论】:

  • -1,OP有正确的想法,先转换为日期。您正在使用 char 工具有效地进行日期转换。
  • +1 给定原始字符串中的常量日期时间格式,这是从字符串转换它的最简单方法。
  • @MarkBannister,它也是最有可能默默失败,最有可能给你错误结果的。是的,如果它是一个 constant datetime format 那么它会起作用,但是它被存储为一个 varchar 并且我不相信潜在的陷阱对于大约 20 个字符的代码和一两个微秒是值得的。
  • @Ben - 那么问题当然不是提出的解决方案,而是原始设计?不要使用 VARCHAR 来表示 DATETIME。即使那是源,添加一个预处理步骤来验证和解析输入,那么您就可以拥有一个 DATETIME 字段,并且绝对相信您拥有您所拥有的认为
  • @Dems,确实应该将日期存储为 DATE 或 TIMESTAMP。但是,有时 VARCHAR 是在遗留应用程序上的全部工作。
【解决方案2】:

juergen d 很好,可能是最快的。不过你也可以这样做:
select cast(to_timestamp('2012-03-11 12:10:00.0 IST', 'YYYY-MM-DD HH24:MI:SS.FF1 "IST"') as date) from dual;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 2021-04-29
    • 2013-10-18
    • 2012-01-15
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多