我需要获取一个 SQL 查询来以 Mmm dd yyyy 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) 我认为当夏令时回来时必须更改我的查询。
源数据是共享点日历,因此我不能简单地将数据类型更改为 datetimeoffset。
有什么想法吗?
谢谢, 史蒂夫
最佳答案
作为一般原则,您不应该使用 SQL 将数据格式化为适合前端的内容。您应该返回 DateTime 类型,并使用格式上的代码来更改它。如果 future 要求支持 DD/MM/YYY 怎么办?您将需要一个单独的查询。最好让前端对其进行格式化。
考虑到这一点,在数据库中存储 2 条数据。 1) DateTime 作为 UTC 值 2) 当前用户的时区(非偏移)
您存储时区而不是偏移量的原因是因为 DST 涉及的所有规则。例如,夏令时开始结束的日期并不是一成不变的。它们每年针对一个国家/地区设置,但该时间表可能会发生变化,这不是需要更新代码的糟糕原因(除非您正在编写时区库。)
一旦获得这两条数据,就可以检索日期和时区,并在服务器中构造一个新对象,该对象允许您将数据库中的时间转换为本地时间。
关于sql - 在 SQL 中使用时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479147/