我正在尝试加载一个制表符分隔的文本文件,该文件包含一列值,而这些值恰好看起来像一个日期,但事实并非如此。似乎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/