sql - H2 DB CSVREAD命令将值转换为日期,然后再放入VARCHAR

标签 sql import h2 tab-delimited

我正在尝试加载一个制表符分隔的文本文件,该文件包含一列值,而这些值恰好看起来像一个日期,但事实并非如此。似乎CSVREAD命令扫描了该行,将列中的文本值转换为java.Sql.Date,然后看到目标列是VARCHAR并执行toString()来获取值...这正是不是我所需要的。实际上,我实际上需要未经日期转换的原始未经转换的文本。

因此,有什么方法可以在CSVREAD命令中关闭“有用的类似日期的列转换”吗?

这是我可以用来证明不良行为的最简单的情况:

CREATE TABLE x
  (
    name VARCHAR NOT NULL
    value VARCHAR
  ) AS
  SELECT *  CSVREAD('C:\myfile.tab', null, 'UTF-8', chr(9))
;


该文件包含三行,一个标题和两个值记录:

name\tvalue\n
x\t110313\n
y\t102911\n


我如何绕过CVSREAD的过度帮助部分的任何帮助将不胜感激。谢谢。

最佳答案

(看来您自己发现了这个,但无论如何):

对于CSVREAD,所有列均为字符串。 CSVREAD函数或数据库不会尝试将值转换为日期,也不会尝试以其他任何方式检测数据类型。数据库仅执行您要求的操作,在您的情况下,该数据作为字符串读取。

如果确实要将列转换为日期,则需要明确地执行此操作,例如:

CREATE TABLE x(name VARCHAR NOT NULL, value TIMESTAMP) AS
SELECT * 
FROM CSVREAD('C:\myfile.tab', null, 'UTF-8', chr(9));


如果需要非默认解析,则可以使用:

CREATE TABLE x(name VARCHAR NOT NULL, value TIMESTAMP) AS
SELECT "name", parsedatetime("value", "M/d/y") as v 
FROM CSVREAD('C:\myfile.tab', null, 'UTF-8', chr(9));

关于sql - H2 DB CSVREAD命令将值转换为日期,然后再放入VARCHAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15844014/

相关文章:

java - 在jsqlparser中向sql查询添加语句

mysql - sphinx搜索字段权重

php - 从表中提取数据,然后按降序回显

java - intellij 找不到来自第三方存储库的 Maven 导入

parsing - ANTLR4:导入和 tokenVocab 之间有什么区别吗?

java - 在 H2 on-disk 和 in-memory DB 之间来回切换

Sql:模拟参数化 LIMIT

mysql - 使用 DISTINCT 关键字将 GROUP_CONCAT 查询从 MySQL 转换为 H2 很困难

java - Flyway h2 postgressql 模式迁移不起作用

python - 如何动态地从包中的模块导入类?