【问题标题】:convert column data varchar to timestamp in H2 Database将列数据 varchar 转换为 H2 数据库中的时间戳
【发布时间】:2020-07-20 12:34:05
【问题描述】:

我想将 varchar 数据转换为现有表中的时间戳。并更改表的数据类型。

DB: H2
platform: Windows

【问题讨论】:

  • 您当前的 var char 是什么样的?它是以单位秒为单位的 var char 吗?这是一个unix日期吗?是时间戳吗?
  • 它的 varchar 时间戳如下 7-18-2020 7:51

标签: h2


【解决方案1】:

很遗憾,您的时间戳不是 SQL 或 ISO 格式,因此您不能简单地更改列的数据类型。在您的情况下,自动转换是不可能的。

在 1.4.200 及更早的版本中,您需要执行两个步骤:

CREATE TABLE TEST(V VARCHAR);
INSERT INTO TEST VALUES ('7-18-2020 7:51');

UPDATE TEST SET V = PARSEDATETIME(V, 'M-d-yyyy HH:mm');
ALTER TABLE TEST ALTER COLUMN V SET DATA TYPE TIMESTAMP;

PARSEDATETIME 返回一个TIMESTAMP 值,但这里它被分配回VARCHAR 列,此操作导致使用SQL 格式('2020-07-18 07:51:00')的隐式转换,可以在期间自动转换回TIMESTAMP以下列的数据类型变化。

如果你可以从 GitHub 上的当前资源构建 H2,有一个更简单的一步解决方案:

CREATE TABLE TEST(V VARCHAR);
INSERT INTO TEST VALUES ('7-18-2020 7:51');

ALTER TABLE TEST ALTER COLUMN V SET DATA TYPE TIMESTAMP USING PARSEDATETIME(V, 'M-d-yyyy HH:mm');

注意:当前的 H2 在许多方面与 1.4.200 不兼容。

【讨论】:

  • 他是否需要在 (M-d-yy HH:mm) 到 (MM-dd-yy HH:mm) 之间添加一个中间体?
  • 单字符 Md 能够接受一位数和两位数的月份和日期。实际上它对列没有限制,应该可以简化转换过程,我会更新我的答案。
  • 感谢@EvgenijRyazanov 的回复。有效。但如果我的日期格式是 17Mar2020145558。 PARSEDATETIME(V, 'ddmmyyyyHHmmss') 函数不起作用。你能在这里帮忙吗:)
  • 它适用于:PARSEDATETIME(V, 'ddMMMyyyyHHmmss') 干杯!!!
  • with com.h2database v2.0.206 USING 也适用于更简单的转换,例如VARCHAR -> INT(对于 H2 和 PostgreSQL 方法相同): ALTER TABLE mytable ALTER COLUMN myfield TYPE INTEGER USING (myfield::INTEGER);
猜你喜欢
  • 2014-02-22
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
相关资源
最近更新 更多