UTC至EST SQL Server 2008

UTC至EST SQL Server 2008,sql,sql-server,sql-server-2008,datetime,dst,Sql,Sql Server,Sql Server 2008,Datetime,Dst,我们有SQL Server 2008中的数据,具有多个日期时间列。由于SQL Server中的日期格式是一个大的整数值,即自1970年以来的秒数,因此我们使用DATEADD()函数将其转换为实际的日期时间格式。但我们面临的问题是,当我们使用DATEADD()时,我们在UTC时区获取数据,而我们希望在EST中获取数据。我试着简单地从时间开始使用-4小时,但在11月至3月期间,我们领先1小时,因为白天休息时的差值是5小时。是否可以使用任何考虑夏令时的功能。感谢您的帮助 Current Functio

我们有SQL Server 2008中的数据,具有多个日期时间列。由于SQL Server中的日期格式是一个大的整数值,即自1970年以来的秒数,因此我们使用
DATEADD()
函数将其转换为实际的日期时间格式。但我们面临的问题是,当我们使用DATEADD()时,我们在UTC时区获取数据,而我们希望在EST中获取数据。我试着简单地从时间开始使用-4小时,但在11月至3月期间,我们领先1小时,因为白天休息时的差值是5小时。是否可以使用任何考虑夏令时的功能。感谢您的帮助

Current Function -> DATEADD(s, columnName, '01/01/1970 00:00:00')
尊敬的Sahil

试试这个:

DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), columnName) 

我会编写一个UDF,与worldtimeserver.com上的时间数据库进行交互——我与他们没有关系,我通过快速的互联网搜索找到了它

进一步的研究表明,timezonedb.com拥有免费(如果是非商业性的)会员资格,允许下载数据库,并提供了如何使用SQL Server和MySQL的示例。

您可以使用我的项目来实现这一点。它使用IANA标准时区名称

以您的示例为基础,以下内容首先从UNIX时间戳转换为基于UTC的
日期时间
,然后在美国东部时区转换为
日期时间

SELECT Tzdb.UtcToLocal(DATEADD(s, columnName, '1970-01-01 00:00:00'), 'America/New_York')

没有任何本地的东西。这是难以置信的困难。多年来,夏令时的日期发生了变化。有些州不承认夏令时。甚至整个亚利桑那州都不承认夏令时。而这只是美国的复杂情况。一旦你离开这些边界,它就会变得更加复杂。有一些完整的库是严格按照日期/时间(如NodaTime、Momentjs等)编写的,但不适用于我所知道的Sql Server,因为这通常是在应用层解决的,不是持久层。您可以导入一个程序集,该程序集包装TimeZoneInfo类,并从windows注册表中读取时区偏移值(与windows的方法相同)。应用windows更新时,这些值会得到零星更新。时区信息不仅会在计划(DST或其他)的基础上发生变化,而且会在区域和国家认为合适的情况下在临时基础上发生变化。我将使用一个经过测试的库并将其导入sql server。这仅在我们希望时间转换在当前时间内时起作用——即,如果它当前是否为夏令时。我相信OP在一年中有日期时间,需要根据字段日期从UTC转换为EST。