在不考虑区域设置的情况下将日期插入SQL
本文关键字:日期 插入 SQL 情况下 不考虑 区域 设置 | 更新日期: 2023-09-27 18:24:12
我的问题看起来很简单:在我的客户端/服务器应用程序中,我想记录客户端提供的特定日期。问题是我不知道客户端的区域设置,也不知道SQL Server的区域设置。
客户端应用程序如何以任何格式(特定用户的最后一次登录)提供日期,并将其存储在可能使用不同区域设置(法语、英语、意大利语、德语等)安装的SQL Server表中。
简单:不要使用字符串。使用键入为日期时间的参数;可以简单到:
DateTime when = ...
using(var cmd = conn.CreateCommand()) {
cmd.CommandText = "... @when ...";
cmd.Parameters.AddWithValue("when", when);
cmd.ExecuteNotQuery();
}
或带有"适配器":
conn.Execute("... @when ...", new { when });
日期/时间实际上只是数字。只有当您将其写入/解析为字符串时,格式化才是一个问题。
只需将所有UTC日期的内容存储在sqlserver中。在检索日期时,将utc日期转换为用户的时区。我希望用户的时区保持在您的数据库中。您需要一个时区表和一个将UTC时间转换为用户当地时间的转换函数。
要在SQL中插入日期,请使用格式为"YYYYMMDD"的字符串
来自客户端的内容您应该知道它是什么
您应该使用Parameters,但也可以通过date.ToString("s")
将日期格式化为ISO格式
使用日期时间格式,将日期存储为UTC时间。
您可能也会对日期时间偏移感兴趣。
验证部分
DateTime dt;
string YourDate = "Your Date";
if (DateTime.TryParse(YourDate, out dt))
{
//Your Code
}
存储过程记录插入/检索
using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string"))
{
con.Open();
SqlCommand cmd = new SqlCommand();
string expression = "Date Parameter value";
DateTime dt;
if (DateTime.TryParse(expression, out dt))
{
//Your Code
}
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "Your Stored Procedure";
cmd.Parameters.Add("Your Parameter Name", SqlDbType.VarChar).Value = expression;
cmd.Connection = con;
using (IDataReader dr = cmd.ExecuteReader())
{
if (dr.Read())
{
}
}
}
在Sql Server中存储数据时,在检索时保持数据格式的一致性并与数据格式同步。。。。