SQL Server 2005与ASP.net日期时间格式的混淆
我在堆栈溢出中发现了一个类似的问题,但它并没有真正回答我的问题。我需要确保我的asp.net应用程序将日期格式设置为与SQL Server 2005相同的dd / mm / yyyy。
如何验证服务器的日期区域性(如果是这样的话)与我对应用程序进行编程的方式是否匹配?是否有特定的数据库设置和操作系统设置?它是特定于表的吗?我不想转置我的日子和月份。
谢谢你
解决方案
从数据库中获取DateTime时,它应采用非区域性格式(如DateTime对象,基于自某个日期以来的滴答数)。只有在将该值转换为字符串时,才需要考虑区域性。在这种情况下,我们可以使用yourDateTimeValue.ToString(" dd / MM / yyyy",CultureInfo.InvariantCulture)确保信息正确显示。
**请注意,因为SQL DateTime列不可为空,其最小值为1/1/1753,而.net DateTimes不可为null,且最小值为1/1/0001. **
如果我们要从真实的DateTime列中提取数据,则默认情况下它将始终采用相同的标准格式。为了将数据保存到列中,我们可能需要在参数中指定SqlDbType.DateTime。
我从http://bytes.com/forum/thread767920.html撕下了它:
com.Parameters.Add(" @ adate",SqlDbType.DateTime).Value = DateTime.Now;
好吧,如果我们将日期时间字段保留在数据库中,则不必担心。
只要我们将应用中的日期保持为强类型(DateTime变量),并通过带有DBParameter / SqlParameter的预备语句发送日期,数据库就会按原样使用它们。
如果使用字符串将日期保存在代码中,则某些强制类型转换将确保我们发送正确的值:
string sqlCmd = @"SELECT * FROM MyTable WHERE MyDateField = CONVERT(datetime, '{0}', 101)"; // assuming myDateString is a string with a date in the local format sqlCmd = string.Format(sqlCmd, Convert.ToDateTime(myDateString).ToString("yyyyMMdd"));
(代码很丑陋,但希望可以理解这一点)
我相信,如果我们使用SqlParameters,ADO.NET将负责其余的工作,我们不必担心。此外,它也可以抵御SQL Injection攻击! :)
正如其他人提到的,就文化上存储日期时间而言,我们应该可以。我建议我们将所有时间存储为标准UTC时间。在SQL Server 2005和更早版本中,无法存储时区信息,但是如果所有内容都存储在通用时间中,则应该可以,因为以后可以将时间转换为本地时间。
SQL Server 2008确实有一些可以识别时区的数据类型,如果我们使用的是.NET 3.5,则可以使用一些工具来帮助进行时区处理/转换。
绝对将时间保留为通用格式。如果我们必须在多个时区工作,那么这将为我们带来与众不同的世界。