我需要获取一个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。
有什么想法吗?
谢谢, 史蒂夫
答案 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,然后将其转换为您指定的格式。
我同意你应该尽可能地尝试处理时区而不是偏移。