【问题标题】:Create a datetime value from separate date time columns从单独的日期时间列创建日期时间值
【发布时间】:2020-05-21 18:59:38
【问题描述】:

我有年、月、日、小时、分钟、秒和毫秒的单独列。我需要将它们全部组合成一个日期时间戳。我可以制作一个日期值,但似乎无法制作一个有效的时间值。我在 Oracle 工作,下面有示例。我希望我的值看起来像 createtime 列。

这成功了:

to_timestamp(XT.MONTH1||'-'||XT.DAY1||'-'||XT.YEAR||' '|| xt.hour24||'.'||xt.minute||'.'||xt.second||'.'||xt.milliseconds,'MM-DD-YYYY HH24:MI:SS.FF') 

【问题讨论】:

  • Oracle 中没有“时间价值”。 Oracle 有datetimestamp 数据类型,以及interval,但没有“时间”数据类型。在大多数情况下,无论如何您都不需要单独使用它 - 您要么需要 date(它总是包括一天中的时间,尽管它的名称),或者 - 不太常见 - interval day to second
  • 将它们附加到一个选择中,然后用 to_timestamp() 调用包装它
  • 在您的示例中,列的顺序与您的日期格式不匹配。您以 xt.month 开头,但格式以 DD 开头。
  • thatjeffsmith 你是真正的“thatjeffsmith”吗?我一直在使用你的博客!
  • @hadoo - 是的,他是。他在这个网站和 OTN 上的时间也非常慷慨。

标签: sql oracle timestamp


【解决方案1】:

这很容易,但并不漂亮。您将数据类型 NUMBER 的列转换为用前导零填充的 VARCHAR2,使用 fm 来抑制 +- 的任何空格:

SELECT TO_CHAR(month,'fm00') FROM mytable;
05

接下来,将转换后的列与 || 运算符粘合在一起,得到一个长字符串:

SELECT TO_CHAR(year,'fm0000')||TO_CHAR(month,'fm00')|| ...
20200519...

这个长字符串现在可以转换为数据类型DATE,或者在您的情况下为TIMESTAMP,因为您有毫秒。您需要指定您使用的日期格式,f.i. 'YYYYMMDD...'

SELECT TO_TIMESTAMP(TO_CHAR(year,'fm0000')|| ... , 'YYYYMM')

一个完整的例子如下:

SELECT TO_TIMESTAMP(
         TO_CHAR(year,'fm0000')||TO_CHAR(month,'fm00')||
         TO_CHAR(day,'fm00')||TO_CHAR(hour24,'fm00')||
         TO_CHAR(minute,'fm00')||TO_CHAR(second,'fm00')||
         TO_CHAR(ms,'fm000')
         , 'YYYYMMDDHH24MISSFF3')
  FROM (-- your table, as a mockup, I'll use DUAL
        SELECT 2020 as year, 5 as month, 19 as day, 
               13 as hour24, 7 as minute, 10 as second, 
               300 as ms 
          FROM DUAL);

2020-05-19 13:07:10,300000000

编辑:

填充模式修饰符fm 抑制正数的前导空格(为负数的- 符号腾出空间)。日期的所有部分都是正数,因此字符串中有很多空格。

SELECT TO_CHAR(x,'99'), TO_CHAR(x,'fm99')
  FROM (SELECT -10 as x FROM DUAL UNION ALL SELECT 10 FROM DUAL);
| 10|10|
|-10|-10|

文档在Format Model Modifiers下有点隐藏。

想想看,你还不如保留空格,调整一下你的格式模型:

SELECT TO_TIMESTAMP(
         TO_CHAR(year,'0000')||TO_CHAR(month,'00')||
         TO_CHAR(day,'00')||TO_CHAR(hour24,'00')||
         TO_CHAR(minute,'00')||TO_CHAR(second,'00')||
         TO_CHAR(ms,'000')
         ,' YYYY MM DD HH24 MI SS FF3')
  FROm (SELECT 2020 as year, 5 as month, 19 as day, 
                 13 as hour24, 7 as minute, 10 as second, 
                300 as ms FROM DUAL);  

【讨论】:

  • 这正是我所需要的。我能问一下'fm'方面在做什么吗,我不明白。谢谢
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2018-09-16
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多