将列数据 varchar 转换为 H2 数据库中的时间戳

Posted

技术标签:

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

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

DB: H2
platform: Windows

【问题讨论】:

您当前的 var char 是什么样的?它是以单位秒为单位的 var char 吗?这是一个unix日期吗?是时间戳吗? 它的 varchar 时间戳如下 7-18-2020 7:51 【参考方案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);

以上是关于将列数据 varchar 转换为 H2 数据库中的时间戳的主要内容,如果未能解决你的问题,请参考以下文章

在单个查询中将VARCHAR(max)列转换为大写,然后转换为XML

将列从 Varchar2 转换为 CLOB 后查询无法执行

Oracle SQL 在包含数据时将列类型从数字更改为 varchar2

将列数据类型为 varchar2 的表数据插入列数据类型为数字的表中

将列中的值转换为现有数据框中的行名

将列中的 SQL 数据转换为数组