如何从数据中获取日期时间值?

时间:2017-06-19 10:23:38

标签: sql sql-server date datetime bulkinsert

我有一个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的好方法。

如何进行?

5 个答案:

答案 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)