如何从数据中获取日期时间值?
How to get datetime value from data?
我有一个 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
”的 Table 中,其中包含一列 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 服务器的好方法。
如何进行?
使用内置字符串函数的 LEFT :
SELECT LEFT('31/10/2014 10:27:12-05',19)
OR
SELECT LEFT(Your_columnname,19)
FROM your_table
这会有所帮助。
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
您需要创建一个分段 table 并按原样从 csv 插入您的记录。
然后尝试 SELECT LEFT('31/10/2014 10:27:14.123456-05',19)
从 staging table 转换并加载到 main table.
使用格式文件导入您的文件,将此字段定义为 varchar(100) 而不是日期时间,在将其作为字符串导入后只需要 19 个字符并将它们转换为日期时间(选择新的 table 或添加一个新的日期时间字段)
更新:
你可以要求 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;
Select 变成 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)
导入时可以使用LEFT
。
DECLARE @Val NVARCHAR(100) = '31/10/2014 10:27:14.123456-05'
SELECT LEFT(@Val, CHARINDEX('-', @Val) - 1)
我有一个 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
”的 Table 中,其中包含一列 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 服务器的好方法。
如何进行?
使用内置字符串函数的 LEFT :
SELECT LEFT('31/10/2014 10:27:12-05',19)
OR
SELECT LEFT(Your_columnname,19)
FROM your_table
这会有所帮助。
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
您需要创建一个分段 table 并按原样从 csv 插入您的记录。
然后尝试 SELECT LEFT('31/10/2014 10:27:14.123456-05',19)
从 staging table 转换并加载到 main table.
使用格式文件导入您的文件,将此字段定义为 varchar(100) 而不是日期时间,在将其作为字符串导入后只需要 19 个字符并将它们转换为日期时间(选择新的 table 或添加一个新的日期时间字段)
更新: 你可以要求 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;
Select 变成 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)
导入时可以使用LEFT
。
DECLARE @Val NVARCHAR(100) = '31/10/2014 10:27:14.123456-05'
SELECT LEFT(@Val, CHARINDEX('-', @Val) - 1)