我有一个csv文件,其中包含一列包含以下数据
31/10/2014 10:27:12-05
31/10/2014 10:27:13.123-05
31/10/2014 10:27:14.123456-05
我需要将这些数据移到名为" CsvData
"其中包含一列data1
datetime
数据类型。
通常日期时间格式应该与this "YYYY-MM-DD hh:mm:ss[.nnn]"
类似,但我的数据看起来不同。我有超过100k行,如上面的3行结构。
我的示例输出外观如下所示:
31/10/2014 10:27:12
31/10/2014 10:27:13
31/10/2014 10:27:14
我正在寻找将整个文件处理成SQL Server的好方法。
如何进行?
答案 0 :(得分:1)
使用内置字符串函数的LEFT:
SELECT LEFT('31/10/2014 10:27:12-05',19)
OR
SELECT LEFT(Your_columnname,19)
FROM your_table
答案 1 :(得分:1)
这会有所帮助。
select convert(varchar(19),'31/10/2014 10:27:12',120) -- for datetime
select convert(varchar(10), '31/10/2014 10:27:12',120) -- for date only
答案 2 :(得分:1)
您需要创建一个临时表并按原样插入csv中的记录。
然后尝试SELECT LEFT('31/10/2014 10:27:14.123456-05',19)
转换并从登台表加载到主表。
答案 3 :(得分:1)
使用格式文件导入文件,其中将此字段定义为varchar(100)而不是datetime,将其作为字符串导入后只需19个字符并将它们转换为datetime(在新表中选择或添加新的datetime字段)< / p>
更新: 你可以要求bcp生成格式文件,如下所示:
create table dbo.dt_str(col1 varchar(100)); -- the table from which to generate fmt-file
exec xp_cmdshell 'bcp b.dbo.dt_str format nul -c -t, -f z:\temp\dt_str.fmt -T'; --can be launched from cmd without xp_cmdshell
这生成了以下文件(3行):
10.0
1
1 SQLCHAR 0 100“\ r \ n”1 col1 Latin1_General_CI_AS
然后你加载你的文件:
BULK INSERT dbo.dt_str
FROM 'z:\temp\dt.csv'
WITH (FORMATFILE = 'z:\temp\dt_str.fmt');
控制导入的内容以及是否可以将其转换为日期时间:
select col1, convert(datetime, left(col1, 19), 103)
from dbo.dt_str;
选择进入new_table:
select convert(datetime, left(col1, 19), 103) as dt
into dbo.dt_new
from dbo.dt_str;
有关格式文件的更多信息,请访问:Use a Format File to Bulk Import Data (SQL Server)
答案 4 :(得分:1)
导入时可以使用LEFT
。
DECLARE @Val NVARCHAR(100) = '31/10/2014 10:27:14.123456-05'
SELECT LEFT(@Val, CHARINDEX('-', @Val) - 1)