【问题标题】:Convert date in file from yyyyMMdd to store in SQL as MMddYYYY将文件中的日期从 yyyyMMdd 转换为在 SQL 中存储为 MMddYYYY
【发布时间】:2015-07-17 14:15:57
【问题描述】:

我有一个日期格式为 20150530 的文件。在将它们插入 SQL 表之前,我需要将它们格式化为以下格式:05302015。我原来的代码是:

private string NormalizeDate(string strInput)
    {
        string strOutput;
        DateTime date;


        if (DateTime.TryParseExact(strInput, "YYYYMMdd", null, System.Globalization.DateTimeStyles.None, out date))
        {
            strOutput = date.ToString("MMddYYYY");
            return strOutput.Trim();
        }
        else
        {

            return strInput.Trim();
        }
    }

但是,在我插入 SQL 之前,日期的格式并没有改变。当我插入表格时,我希望日期采用 MMddYYYY 格式(没有破折号或空格)。然后使用该格式,我需要将这些日期合并到另一个表中,但格式需要为 MMddYYYY。

我唯一的其他选择是进行某种查询,该查询可以从 Table1 (20150530) 中获取原始日期,然后将格式转换为 (05302015) 格式的 Table2。我尽量不混淆任何人。 Table1 的数据类型是 datetime,它将插入到 Table2 中的列是 nvarchar。

【问题讨论】:

  • 列是什么类型的?如果是日期,则格式无关紧要。
  • ...如果不是日期,那为什么不是日期? :) 但是说真的,到目前为止你尝试过什么?你哪里有问题?
  • 现在是日期时间。出于特定和独特的原因,我需要更改此格式。有什么想法吗?
  • @JustinSmith 如果是日期时间,SQL 更希望您将其传递为:20100530 - YYYYMMDD
  • 您是通过BULK 还是常规INSERT 命令插入?

标签: c# sql-server


【解决方案1】:

如果存储为日期时间,则

declare @time date ='20100530'

select
replace(convert(varchar, @time, 101),'/','')

如果存储为 int 则

declare @time int ='20100530'

select
replace(convert(varchar, cast(CONVERT(varchar, @time)as DATE),101),'/','')

两者都会将其更改为 05302010

【讨论】:

    【解决方案2】:

    如果您在 C# 和 Sql Server 之间交谈时完全担心格式,那么您已经迷路了。关心格式意味着您使用的技术极易受到 sql 注入攻击!

    而不是这样的:

    //Don't **EVER** put data into SQL strings this, or I will hunt you down and kill your dog.
    string sql = "INSERT INTO [table] (column1, column2) VALUES ('{0}', '{1}')";
    foreach (var values in data)
    {
        sqlcmd.CommandText = string.Format(sql, values[0], NormalizeDate(values[1]));
        sqlcmd.ExecuteNonQuery();
    }
    

    你需要这样做:

    sqlcmd.CommandText = "INSERT INTO [table] (column1, column2) VALUES (@column1, @column2)";
    sqlcmd.Parameters.Add("@column1", SqlDbType.NVarChar, 50);
    sqlcmd.Parameters.Add("@column2", SqlDbType.DateTime);
    foreach (var values in data)
    {
        sqlcmd.Parameters["@column1"].Value = values[0];
        sqlcmd.Parameters["@column2"].Value = DateTime.Parse(values[1]);
        sqlcmd.ExecuteNonQuery();
    }
    

    这里的重点是您使用 C# datetime 类型与 Sql Server Datetime 列对话,并且您使用 Parameterized Queries 来实现这一点。

    当您这样做时,您不再关心格式。这一切都由 ADO.Net 在幕后为您处理。此外,这是确保您的代码不会受到 sql 注入攻击的唯一故障安全方法。

    现在,几乎可以肯定的是,在所有这些之后,Sql Server 没有使用您期望的格式存储 datetime 列。事实上,Sql Server 对日期时间值使用二进制格式,甚至人类都无法阅读。您习惯使用 SQL 看到的格式只是查询工具为了方便而显示的内容。这好的,因为它再次以相同的方式出现。当您从数据库中检索数据时,ADO.Net 将再次执行此操作,您将获得一个 .Net DateTime 值,您可以根据自己的喜好对其进行格式化。

    这就是假定数据库的工作方式:DB 中的静态数据以对 DB 最有效的格式存在,查询或应用程序的工作就是- 为您需要的特定演示案例及时格式化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-04
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多