在不考虑区域设置的情况下将日期插入SQL

本文关键字:日期 插入 SQL 情况下 不考虑 区域 设置 | 更新日期: 2023-09-27 18:24:12

我的问题看起来很简单:在我的客户端/服务器应用程序中,我想记录客户端提供的特定日期。问题是我不知道客户端的区域设置,也不知道SQL Server的区域设置。

客户端应用程序如何以任何格式(特定用户的最后一次登录)提供日期,并将其存储在可能使用不同区域设置(法语、英语、意大利语、德语等)安装的SQL Server表中。

在不考虑区域设置的情况下将日期插入SQL

简单:不要使用字符串。使用键入为日期时间的参数;可以简单到:

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中存储数据时,在检索时保持数据格式的一致性并与数据格式同步。。。。