我发现了一个关于堆栈溢出的类似问题,但它并没有真正回答我的问题。我需要确保我的 asp.net 应用程序将日期 dd/mm/yyyy 格式化为与我的 SQL Server 2005 相同。
如何验证服务器的日期文化(如果是这样的话)是否与我对应用程序的编程方式相匹配?是否有特定的数据库设置和操作系统设置?它是特定于表的吗?我不想改变我的日子和月份。
谢谢你
我发现了一个关于堆栈溢出的类似问题,但它并没有真正回答我的问题。我需要确保我的 asp.net 应用程序将日期 dd/mm/yyyy 格式化为与我的 SQL Server 2005 相同。
如何验证服务器的日期文化(如果是这样的话)是否与我对应用程序的编程方式相匹配?是否有特定的数据库设置和操作系统设置?它是特定于表的吗?我不想改变我的日子和月份。
谢谢你
当您从数据库中获取 DateTime 时,它应该采用非培养格式(如 DateTime 对象,基于自某个日期以来的滴答数)。只有当您将该值转换为字符串时,您才需要关注文化。在这些情况下,您可以使用 yourDateTimeValue.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) 来确保信息正确显示。
我相信如果您使用 SqlParameters,ADO.NET 会处理剩下的事情,您不必担心。此外,它对防御 SQL 注入攻击也有好处!:)
** 请注意,因为 SQL DateTime 列不可为空,其最小值为 1/1/1753,而 .net DateTimes 不可为空,最小值为 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"));
(代码很丑,但希望它能够理解)
正如其他人所提到的,就文化上存储日期时间而言,您应该没问题。我建议您将所有时间存储为标准 UTC 时间。在 SQL Server 2005 及更早的版本中,无法存储时区信息,但如果所有内容都以通用时间存储,则应该没问题,因为稍后可以将时间转换为本地时间。
SQL Server 2008 确实有一些知道时区的数据类型,如果您使用的是 .NET 3.5,则有一些工具可以帮助处理/转换时区。
绝对以通用格式保存时间。如果您必须在多个时区工作,这将改变世界。