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

时间:2012-02-13 11:56:17

标签: c# sql sql-server-2008 sql-server-2005 c#-4.0

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

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

6 个答案:

答案 0 :(得分:4)

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

DateTime when = ...

using(var cmd = conn.CreateCommand()) {
    cmd.CommandText = "... @when ...";
    cmd.Parameters.AddWithValue("when", when);
    cmd.ExecuteNotQuery();
}

或“dapper”:

conn.Execute("... @when ...", new { when });

日期/时间实际上只是数字。只有在您将其编写/解析为字符串时才会出现格式化问题。

答案 1 :(得分:1)

只需将所有内容存储在sqlserver中的UTC日期即可。并且在检索日期时将utc日期转换为用户的时区。我希望用户时区在您的数据库中维护。 您将需要一个时区表和一个转换函数,它将UTC时间转换为用户本地时间。

答案 2 :(得分:1)

在SQL中插入日期使用“YYYYMMDD”形式的字符串 来自客户端的东西你应该知道它是什么

答案 3 :(得分:0)

您应该使用参数,但您也可以通过date.ToString("s")

将日期格式化为ISO格式

答案 4 :(得分:0)

使用日期时间格式,将日期存储为UTC时间

你可能也对datetimeoffset感兴趣。

答案 5 :(得分:0)

验证部分

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