将文件中的日期从yyyyMMdd转换为以SQL格式存储为MMddYYYY

时间:2015-07-17 14:15:57

标签: c# sql-server

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

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。

我唯一的另一个选择是让某种查询可以从表1(20150530)中取出原始日期,然后将格式转换为Table2,格式为(05302015)。我想尽量不要混淆任何人。 Table1的数据类型是datetime,它将插入Table2的列是nvarchar。

2 个答案:

答案 0 :(得分:0)

如果它存储为datetime那么

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

答案 1 :(得分:0)

如果您在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列进行通信,并使用参数化查询来实现此目的。

执行此操作时,您不再关心格式。这一切都是由ADO.Net在幕后为您处理的。此外,这是唯一一种确保您的代码不会疯狂的故障安全方法 - 容易受到SQL注入攻击。

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

这就是数据库假设的工作原理:数据库中静止的数据采用对数据库最有效的格式,它是查询或应用程序的工作。 - 按时格式化您需要的特定演示文稿。