我有这样的查询:转换日期时间为UTC值MSSQL
SELECT table.a, table.b, table.c from Table table
我怎么能投“table.b” UTC时间只需添加CAST到查询?
SELECT
table.a,
**%CAST_TO_UTC_FUNCTION to table.b%**,
table.c
from Table table
我无法单独投射它并声明局部变量。
我有这样的查询:转换日期时间为UTC值MSSQL
SELECT table.a, table.b, table.c from Table table
我怎么能投“table.b” UTC时间只需添加CAST到查询?
SELECT
table.a,
**%CAST_TO_UTC_FUNCTION to table.b%**,
table.c
from Table table
我无法单独投射它并声明局部变量。
你可以写你的查询,如下所示:
SELECT
table.a,
dateAdd(
second,
dateDiff(second, getDate(), getUtcDate()),
table.b) as b_converted_to_UTC,
table.c
from Table table
这b
列中的值转换为UTC,通过增加这些值,目前当地的日期(getDate()
)之间存在的tmie差和UTC日期(getUtcDate()
)。
为了上面的查询工作,必须满足以下条件:
b
列中的日期(S)必须在当地时间这假定*当前*偏移量适用于所有数据。如果时区有夏时制,那么这将无法持续工作。 –
@MattJohnson是真的。我可以从我的经验告诉你,最好避免在SQL中做时髦的时区翻译。通常最好将日期存储为UTC,并在客户端/表示层上转换时区。 – GolfWolf
是的 - 确切地说。 SQL不是这类事情的最佳地方。 –
我通过创建一个存储日期范围和当前UTC偏移量的临时表来解决此问题。 下面是部分解决方案,适用于美国从2007年开始,适用于观察DST的地区。 可以2007. 之前容易地修改以用于年请参阅溶液的端部为一个示例用法
-- GET UTC for time in US for region that observe Daylight Saving Time (meaning will not work for part of Arizona and Hawaii)
DECLARE
@DSTStartDay datetime = '2007-03-1 02:00:00',
@DSTEndDay datetime = '2007-11-1 02:00:00',
@i int = 0,
@currDate datetime,
@offset int
DECLARE
@DST TABLE (StartDate datetime, EndDate datetime, DSTOffset int)
-- Insert into @DST DSTOffset of 0 if not DST date range, and -1 if DST date as temporary offset value
-- Then when we get Time Zone Offset, we can update DSTOffset to actual current offset (hours)
WHILE @i < 20
BEGIN
INSERT @DST
SELECT DATEADD(d,
15 - CASE DATEPART(dw, @DSTStartDay)
WHEN 1 THEN 8
ELSE DATEPART(dw, @DSTStartDay)
END,
@DSTStartDay),
DATEADD(d,
8 - CASE DATEPART(dw, @DSTEndDay)
WHEN 1 THEN 8
ELSE DATEPART(dw, @DSTEndDay)
END,
@DSTEndDay),
-1;
SET @DSTStartDay = DATEADD(yy,1,@DSTStartDay)
INSERT @DST
SELECT DATEADD(d,
8 - CASE DATEPART(dw, @DSTEndDay)
WHEN 1 THEN 8
ELSE DATEPART(dw, @DSTEndDay)
END,
@DSTEndDay),
DATEADD(d,
15 - CASE DATEPART(dw, @DSTStartDay)
WHEN 1 THEN 8
ELSE DATEPART(dw, @DSTStartDay)
END,
@DSTStartDay),
0;
SET @DSTEndDay = DATEADD(yy,1,@DSTEndDay)
SET @i = @i + 1
END
-- Get temporary offset for current date
SET @currDate = GETDATE()
SELECT @Offset = DSTOffset FROM @DST
WHERE StartDate < @currDate AND EndDate >= @currDate
-- Calculate Time Zone Offset (ignore DST) and update DSTOffset in @DST table from temporary to actual offset
SET @Offset = DATEDIFF(hh, GETDATE(), GETUTCDATE()) - @Offset
UPDATE @DST
SET DSTOffset = DSTOffset + @Offset
--SELECT * FROM @DST - look at the table
--Sample usage
DECLARE @myDateNoDST datetime = '2014-03-08 06:00',
@myDateWithDST datetime = '2014-03-09 06:00'
SELECT @myDateNoDST LocalDateNoDST,
(SELECT DATEADD(hh,DSTOffset,@myDateNoDST) FROM @DST d WHERE StartDate < @myDateNoDST AND EndDate >= @myDateNoDST) UTCDateNoDST,
@myDateWithDST LocalDateWithDST,
(SELECT DATEADD(hh,DSTOffset,@myDateWithDST) FROM @DST d WHERE StartDate < @myDateWithDST AND EndDate >= @myDateWithDST) UTCDateWithDST
[此答案](http://stackoverflow.com/a/4118416/390819)可help – GolfWolf
'table.b'的原始数据类型是什么? –
@AdrianWragg(datetime,not null) –