在SQL中使用时区
我需要获取一个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'
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)
,它似乎工作得很好,而且明显不那么难看!