将文件中的日期从yyyyMMdd转换为存储在SQL中的yyyymyyy

本文关键字:存储 SQL yyyymyyy 中的 转换 yyyyMMdd 文件 日期 | 更新日期: 2023-09-27 18:03:19

我有一个日期格式为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。

我唯一的其他选择是有某种查询,可以从我们说表1(20150530)中获取原始日期,然后以(05302015)的格式将格式转换为表2。我不想让任何人感到困惑。表1的数据类型为datetime,要插入到表2中的列为nvarchar。

将文件中的日期从yyyyMMdd转换为存储在SQL中的yyyymyyy

如果存储为datetime则

declare @time date ='20100530'
select
replace(convert(varchar, @time, 101),'/','')

如果存储为整型,则

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

都将其更改为05302010

如果你在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#日期时间类型与Sql Server日期时间列对话,并且使用参数化查询来实现这一点。

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

现在,几乎可以肯定的是,在所有这些之后,Sql Server没有使用您期望的格式存储datetime列。事实上,Sql Server使用二进制格式的日期时间值甚至不是人类可读的。您习惯在SQL中看到的格式只是查询工具为方便而显示的。这是,因为它的工作方式是一样的。当您从数据库检索数据时,ADO。Net会做它的事情,你得到一个。Net DateTime值,你可以把它格式化成你想要的内容。

这就是数据库应该的工作方式:数据库中的静态数据以对数据库最有效的格式存在,查询或应用程序的工作是为您需要的特定表示情况及时格式化它。