2009-11-05 61 views
0

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

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

回答

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和时区,然后再沿此路径行进。从本地计算机存储时间和忽略时区就足够了,这是一个很好的机会。

+0

当然更好的存储为2个字段 - 日期时间,然后将时区作为单独的字段 – Mark 2009-11-05 12:48:34

+0

我将考虑存储当地时间。我认为我正在为了满足我的需要而使这变得复杂。感谢您的帮助和信息! – 2009-11-05 18:08:36

1

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

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

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