H2 DB CSVREAD命令在放入VARCHAR之前将值转换为日期

时间:2013-04-05 21:35:44

标签: 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无用的部分将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

对于那些csv文件中没有标题的人,示例可能是这样的:

CREATE TABLE x(name VARCHAR NOT NULL, value TIMESTAMP) AS
SELECT "0", parsedatetime("1", 'd-M-yyyy') as v 
FROM CSVREAD('C:\myfile.tab', '0|1', 'UTF-8', '|');

请注意日期格式周围的单引号。当我尝试使用Thomas的例子时,它使用H2给出了一个错误:

  

未找到“d-M-yyyy”栏; SQL语句:

我的csv文件:

firstdate|13-11-2013\n
seconddate|14-11-2013