【问题标题】:How to format year and month only, from a bulk insert如何从批量插入仅格式化年和月
【发布时间】:2018-02-22 10:21:46
【问题描述】:

我的 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',但我不知道该怎么做?

【问题讨论】:

    标签: sql-server date date-formatting string-to-datetime


    【解决方案1】:

    一个蛮力选项是将您的部分日期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;
    

    这当然假设您可以将每个日期设置为每月的第一天。

    【讨论】:

    • 我认为这可能是唯一的选择,我刚刚搜索过,我认为 SQL 不能仅将年和月存储为日期格式,这是不可能的。
    • @VS1SQL 可能有一种方法可以批量加载和转换数据。 MySQL 的LOAD DATA 有这种能力,如果SQL Server 有类似的东西,我不会感到惊讶。话虽这么说,如果您想保留原始数据,那么我的回答至少是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多