将列数据 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) 之间添加一个中间体? 单字符M
和 d
能够接受一位数和两位数的月份和日期。实际上它对列没有限制,应该可以简化转换过程,我会更新我的答案。
感谢@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
Oracle SQL 在包含数据时将列类型从数字更改为 varchar2