转换/搜索GETUTCDATE()

时间:2009-11-05 03:26:18

标签: c# sql sql-server timezone

如果我将所有日期存储在SQL Server 2005中作为GetUtcDate(),那么搜索这些日期字段的最佳方法是什么。我正在使用C#所以我应该使用C#(传递给Stored Proc)将用户提交的日期转换为UTC以在SQL中搜索我的日期吗?

此外,由于我使用UTC,我需要担心日光节省吗?当我想向用户/视图显示日期/时间时,我只是添加/减去偏移量吗?将我的UTC日期/时间从数据库转换为用户时区进行显示时,有什么需要注意的吗?

2 个答案:

答案 0 :(得分:1)

“我应该使用C#(传递给Stored Proc)将用户提交的日期转换为UTC,以便在SQL中搜索我的日期吗?” - 听起来像个好主意

“因为我使用UTC,我需要担心日光节省吗?” - 不,当您在本地和UTC时间之间进行转换时,C#会处理这个问题。

不要只添加/减去偏移量,使用C#DateTime函数在UTC和本地时间之间进行转换。这样它就会照顾DST。

答案 1 :(得分:1)

处理时区是@ $$的主要痛苦。需要考虑的一件事是Windows只存储当前的DST规则,而不是历史规则。因此,如果您依赖规则来准确地重新创建旧值,您可能会发现数据存在一些差异。 DST规则一直在变化。有些国家甚至没有制定规则,他们只是每年公布日期。

如果您无法承受数据中的差异,最好将日期存储为字符串,并在其中编码时区信息。在.Net中,您可以使用DateTime.ToString(“O”)。这种格式与文化无关,因此无论代码运行的文化如何,您都将始终获得相同的格式。

var origDt = DateTime.Now;
var dtStr = origDt.ToString("O");
var newDt = DateTime.Parse(dtStr, null, System.Globalization.DateTimeStyles.RoundtripKind);
Console.WriteLine(dtStr);
if (newDt == origDt)
    Console.WriteLine("Dates equal"); // should be true
else
    Console.WriteLine("Dates not equal");

有关此格式样式的详细信息,请查看MSDN documentation

当然这需要付出代价。按日期搜索数据库效率很低(可以完成,但字符串需要转换为日期)。无论如何,时区差异无关紧要。这实际上取决于您对数据的处理方式以及准确性的重要性。

在沿着这条路走下去之前,您可能希望确保项目实际上需要UTC和时区。有一个很好的机会,只需从本地计算机存储时间并忽略时区就足够了。