如何从批量插入中仅格式化年份和月份
How to format year and month only, from a bulk insert
我有来自 excel 的数据,其中只有年份和月份,例如 2012-01
01 是一月。
对于我的脚本:
IF OBJECT_ID('[test].[dbo].[yearMONTH]', 'U') IS NOT NULL
begin
DROP TABLE [test].[dbo].yearMONTH;
print 'Dropped Table [test].[dbo].[yearMONTH]';
end
GO
CREATE TABLE [test].[dbo].[yearMONTH]
(
[yearMONTH] date
);
GO
BULK INSERT [test] FROM 'C:\Users\....csv'
With
(
FirstROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
我知道这会失败,因为 SQL 无法识别数据的日期格式。
我在想把它作为一个字符串输入?但这仍然不能解决在 SQL.
中将其存储为年月日期的问题
我是否必须将数据作为 varchar 批量插入?然后将数据类型转换为日期,每个 [year-month] 在一天的末尾有 01,例如2012-01-01,然后切断日期并将年月放在单独的列中?
我在该解决方案中唯一看到的是,一旦我将年月与日分开,新的 [年 - 月] 日期将不会存储为日期格式?
我想第一步是将数据从 excel 导入 sql,然后将字符串 'yyyy-mm' 转换为日期格式 'yyyy-mm-dd'但我不确定该怎么做?
一个强力选项是将您的部分日期 2018-02
数据作为文本批量插入,然后构建一个日期列:
ALTER TABLE test ADD your_date DATETIME;
UPDATE test
SET your_date = CONVERT(date, orig_date + '-01');
然后,如果您不再需要原始文本日期列,您可以删除它:
ALTER TABLE test DROP COLUMN orig_date;
这当然假设您可以将每个日期设置为每月的第一天。
我有来自 excel 的数据,其中只有年份和月份,例如 2012-01
01 是一月。
对于我的脚本:
IF OBJECT_ID('[test].[dbo].[yearMONTH]', 'U') IS NOT NULL
begin
DROP TABLE [test].[dbo].yearMONTH;
print 'Dropped Table [test].[dbo].[yearMONTH]';
end
GO
CREATE TABLE [test].[dbo].[yearMONTH]
(
[yearMONTH] date
);
GO
BULK INSERT [test] FROM 'C:\Users\....csv'
With
(
FirstROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
我知道这会失败,因为 SQL 无法识别数据的日期格式。
我在想把它作为一个字符串输入?但这仍然不能解决在 SQL.
我是否必须将数据作为 varchar 批量插入?然后将数据类型转换为日期,每个 [year-month] 在一天的末尾有 01,例如2012-01-01,然后切断日期并将年月放在单独的列中?
我在该解决方案中唯一看到的是,一旦我将年月与日分开,新的 [年 - 月] 日期将不会存储为日期格式?
我想第一步是将数据从 excel 导入 sql,然后将字符串 'yyyy-mm' 转换为日期格式 'yyyy-mm-dd'但我不确定该怎么做?
一个强力选项是将您的部分日期 2018-02
数据作为文本批量插入,然后构建一个日期列:
ALTER TABLE test ADD your_date DATETIME;
UPDATE test
SET your_date = CONVERT(date, orig_date + '-01');
然后,如果您不再需要原始文本日期列,您可以删除它:
ALTER TABLE test DROP COLUMN orig_date;
这当然假设您可以将每个日期设置为每月的第一天。