sql—从单独的日期时间列创建日期时间值

piah890a  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(466)

我有年、月、日、时、分、秒和毫秒的单独列。我需要把它们组合成一个日期时间戳。我可以生成日期值,但似乎无法生成有效的时间值。我在甲骨文工作,我有下面的例子。我希望我的值看起来像createtime列。
这就成功了:

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

s1ag04yj

s1ag04yj1#

这很简单,但不漂亮。从数据类型转换列 NUMBERVARCHAR2 用前导零填充,使用 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|

文档在格式模型修改器下有点隐藏。
想一想,不妨保留空格,调整格式模型:

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);

相关问题