我有一个日期格式为: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。
答案 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值,并且您可以将其格式化为您的内容。
这就是数据库假设的工作原理:数据库中静止的数据采用对数据库最有效的格式,它是查询或应用程序的工作。 - 按时格式化您需要的特定演示文稿。