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

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)