在SQL中使用时区

在SQL中使用时区,sql,sharepoint-2010,Sql,Sharepoint 2010,我需要获取一个SQL查询,以便以Mmm dd yyy hh:mm AM/PM格式从日期时间字段输出日期。到目前为止,我能想到的最好的方法是: SELECT Left( Convert( nvarchar(30), SWITCHOFFSET( CAST(datetime1 as datetimeoffset), '-05:00'

我需要获取一个SQL查询,以便以
Mmm dd yyy hh:mm AM/PM
格式从日期时间字段输出日期。到目前为止,我能想到的最好的方法是:

SELECT Left(
           Convert(
               nvarchar(30),
               SWITCHOFFSET(
                   CAST(datetime1 as datetimeoffset),
                   '-05:00'
               ),
               0
           ),
           LEN(
               Convert(
                   nvarchar(30),
                   SWITCHOFFSET(
                       CAST(datetime1 as datetimeoffset),
                       '-05:00'
                   )
               )
           )-11
       )
然而,a)它是丑陋的!我觉得这个应该比那个简单,;b)我想当夏令时回来时,我必须改变我的查询

源数据是sharepoint日历,因此我不能简单地将数据类型更改为datetimeoffset

有什么想法吗

谢谢,
Steve

作为一名普通负责人,您不应该使用SQL将数据格式化为前端可以看到的格式。您应该返回日期时间类型,并使用格式上的代码对其进行更改。如果将来需要支持DD/MM/YYY,该怎么办?您需要一个单独的查询。最好让前端对此进行格式化

记住这一点,在数据库中存储2条数据。1) 日期时间作为UTC值2)当前用户的时区(非偏移)

存储时区而不是偏移量的原因是DST涉及的所有规则。例如,DST开始和结束的日期并不是一成不变的。它们是为一个国家每年设置的,但是时间表可能会改变,这不是需要更新代码的好理由(除非您正在编写时区库)


一旦有了这两条数据,您就可以检索日期和时区,并在服务器中构造一个新对象,允许您将数据库中的时间转换为本地时间。

我是否遗漏了什么,或者只是:

Convert(nvarchar(30), DATEADD(Hour, -5, datetime1), 100)
这将为datetime1增加-5小时,然后将其转换为您指定的格式


我同意你应该尽可能地处理时区而不是偏移。

这实际上是在最后发生的。我正在使用执行SQL操作从内容数据库中提取数据。你说的方法听起来正是我需要的。你能给我举个例子吗?谢谢我没有一个真正的代码示例,关于实现是否有一些特定的东西让人困惑?不,我想我可以从中找到答案。我承认我在问一个例子时有点懒。Thanks@Bytemaster&@tayon!我把它们放在一起,得出了这样一个结论:
将@TZoffset声明为int Set@TZoffset=DATEDIFF(hour,GETUTCDATE(),GETDATE())选择Convert(nvarchar(30),DATEADD(hour,@TZoffset,datetime1),0)
,它似乎工作得很好,而且明显不那么难看!