在SQL中使用时区

时间:2011-12-12 18:36:02

标签: sql sharepoint-2010

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

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。

有什么想法吗?

谢谢, 史蒂夫

2 个答案:

答案 0 :(得分:3)

作为一般原则,您不应该使用SQL将数据格式化为前端可呈现的内容。您应该返回DateTime类型,并使用格式上的代码进行更改。如果未来的要求支持DD / MM / YYY怎么办?您需要一个单独的查询。最好让前端格式化它。

考虑到这一点,在数据库中存储2个数据。 1)DateTime作为UTC值2)当前用户的时区(不是偏移量)

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

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

答案 1 :(得分:0)

我错过了什么,或者只是简单地说:

Convert(nvarchar(30), DATEADD(Hour, -5, datetime1), 100)

这应该将-5小时添加到datetime1,然后将其转换为您指定的格式。

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