[SQL] select 문에서 현지 시간으로 UTC에서 날짜 시간 열을 변환
SQLselect 문에서 현지 시간으로 UTC에서 날짜 시간 열을 변환
나는 몇 가지 SQL 쿼리를 선택하고있어 내 쿼리 결과에서 현지 시간으로 표시 할 현지 시간으로 내 UTC 날짜 열을 변환하고 싶습니다. 참고 난 내 데이터베이스에 대해 수동 및 임의의 SQL 쿼리를하고있는 중이 야 때 코드를 통해 오히려이 변환을 찾고 있지 않다.
해결법
-
==============================
1.SQL 서버 2008 이상에 다음과 같이이 작업을 수행 할 수 있습니다 :
SQL 서버 2008 이상에 다음과 같이이 작업을 수행 할 수 있습니다 :
SELECT CONVERT(datetime, SWITCHOFFSET(CONVERT(datetimeoffset, MyTable.UtcColumn), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS ColumnInLocalTime FROM MyTable
또한 자세한 덜 할 수 있습니다 :
SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), MyTable.UtcColumn) AS ColumnInLocalTime FROM MyTable
무슨 일이 있어도 사용하지 마십시오 - 작업이 원자 없기 때문에, 날짜를 빼기 위해, 당신이 경우에 인해 시스템 날짜 및 현지 날짜 사이의 경쟁 조건에 불확실한 결과를 얻을 비 원자, 즉 서로 다른 시간에 (에서 확인되고 ).
이 답변으로 계정에 DST을하지 않습니다. 당신이 DST 조정을 포함 할 경우, 또한 다음과 같은 SO 질문을 참조하십시오 :
SQL Server의 일광 절약 시간 시작 및 종료 기능을 만드는 방법
-
==============================
2.나는 특정 시간대 (NOT 서버의 시간대 푸른 SQL 데이터베이스를 UTC로 실행되기 때문에)에 날짜를 UTC로 저장된 날짜를 받고 이러한 예 중 하나가 도움이되지 않았다. 이것은 내가 그것을 처리하는 방법입니다. 그것은 우아한 아니지만 그것은 간단하고 다른 테이블을 유지하지 않고 당신에게 정답을 제공합니다 :
나는 특정 시간대 (NOT 서버의 시간대 푸른 SQL 데이터베이스를 UTC로 실행되기 때문에)에 날짜를 UTC로 저장된 날짜를 받고 이러한 예 중 하나가 도움이되지 않았다. 이것은 내가 그것을 처리하는 방법입니다. 그것은 우아한 아니지만 그것은 간단하고 다른 테이블을 유지하지 않고 당신에게 정답을 제공합니다 :
select CONVERT(datetime, SWITCHOFFSET(dateTimeField, DATEPART(TZOFFSET, dateTimeField AT TIME ZONE 'Eastern Standard Time')))
-
==============================
3.당신이 당신의 서버의 위치가 아닌 다른 변환이 필요한 경우, 여기 당신이 표준 오프셋을 통과 할 수 있으며 미국의 일광 절약 시간을 차지하는 기능입니다 :
당신이 당신의 서버의 위치가 아닌 다른 변환이 필요한 경우, 여기 당신이 표준 오프셋을 통과 할 수 있으며 미국의 일광 절약 시간을 차지하는 기능입니다 :
-- ============================================= -- Author: Ron Smith -- Create date: 2013-10-23 -- Description: Converts UTC to DST -- based on passed Standard offset -- ============================================= CREATE FUNCTION [dbo].[fn_UTC_to_DST] ( @UTC datetime, @StandardOffset int ) RETURNS datetime AS BEGIN declare @DST datetime, @SSM datetime, -- Second Sunday in March @FSN datetime -- First Sunday in November -- get DST Range set @SSM = datename(year,@UTC) + '0314' set @SSM = dateadd(hour,2,dateadd(day,datepart(dw,@SSM)*-1+1,@SSM)) set @FSN = datename(year,@UTC) + '1107' set @FSN = dateadd(second,-1,dateadd(hour,2,dateadd(day,datepart(dw,@FSN)*-1+1,@FSN))) -- add an hour to @StandardOffset if @UTC is in DST range if @UTC between @SSM and @FSN set @StandardOffset = @StandardOffset + 1 -- convert to DST set @DST = dateadd(hour,@StandardOffset,@UTC) -- return converted datetime return @DST END GO
-
==============================
4.현지 날짜 시간은 동부 표준시 말이며 푸른 SQL 이상 SQL 서버 2016에서 다음, 그에게 UTC로 변환하려는 경우, 당신은 할 수 있습니다 :
현지 날짜 시간은 동부 표준시 말이며 푸른 SQL 이상 SQL 서버 2016에서 다음, 그에게 UTC로 변환하려는 경우, 당신은 할 수 있습니다 :
SELECT YourUtcColumn AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS LocalTime FROM YourTable
시간대 이름의 전체 목록을 찾을 수 있습니다 :
SELECT * FROM sys.time_zone_info
일광 절약 고려, 그것은 동부 표준 시간 임에도 불구하고 - 그리고 예, 시간대가 잘못 지정됩니다.
-
==============================
5.새 SQL Server 2016의 기회를 사용 :
새 SQL Server 2016의 기회를 사용 :
CREATE FUNCTION ToLocalTime(@dtUtc datetime, @timezoneId nvarchar(256)) RETURNS datetime AS BEGIN return @dtUtc AT TIME ZONE 'UTC' AT TIME ZONE @timezoneId /* -- second way, faster return SWITCHOFFSET(@dtUtc , DATENAME(tz, @dtUtc AT TIME ZONE @timezoneId)) */ /* -- third way declare @dtLocal datetimeoffset set @dtLocal = @dtUtc AT TIME ZONE @timezoneId return dateadd(minute, DATEPART (TZoffset, @dtLocal), @dtUtc) */ END GO
그러나 CLR 절차는 빠르게 5 회에서 작동 : '- (
하나 개의 시간대 오프셋 있음에주의 겨울 또는 여름 시간을 변경할 수 있습니다. 예를 들면
select cast('2017-02-08 09:00:00.000' as datetime) AT TIME ZONE 'Eastern Standard Time' select cast('2017-08-08 09:00:00.000' as datetime) AT TIME ZONE 'Eastern Standard Time'
결과 :
2017-02-08 09:00:00.000 -05:00 2017-08-08 09:00:00.000 -04:00
당신은 오프셋 상수를 추가 할 수 없습니다.
-
==============================
6.데이터베이스에 CLR을 가능하게하는 옵션뿐만 아니라 SQL 서버의 시간대를 사용하는 경우, 그것은 아주 쉽게 닷넷에서 쓸 수 있습니다.
데이터베이스에 CLR을 가능하게하는 옵션뿐만 아니라 SQL 서버의 시간대를 사용하는 경우, 그것은 아주 쉽게 닷넷에서 쓸 수 있습니다.
public partial class UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction] public static SqlDateTime fn_GetLocalFromUTC(SqlDateTime UTC) { if (UTC.IsNull) return UTC; return new SqlDateTime(UTC.Value.ToLocalTime()); } }
UTC의 날짜 시간 값에 가서 서버에 로컬 날짜 시간 값의 상대가 나옵니다. 널 값은 널 (null)을 반환합니다.
-
==============================
7.정확하고 일반적인 방법으로이 작업을 수행하는 간단한 방법은 없습니다.
정확하고 일반적인 방법으로이 작업을 수행하는 간단한 방법은 없습니다.
우선 오프셋 문제의 날짜, 시간대 및 DST에 달려 있음을 이해하여야한다. 에 GetDate ()는 - GETUTCDATE는 관련이없는 서버의 TZ, 당신에게 오프셋 오늘을 제공합니다.
나는 두 작업 솔루션을 보았다 내가 많이 검색 할 수 있습니다.
같은 시간대 및 TZ 당 DST 규칙 등의 기본 데이터 테이블의 부부와 함께 1) 사용자 정의 SQL 함수. 근무하지만 매우 우아하지. 내가 코드를 소유하지 않기 때문에 나는 그것을 게시 할 수 없습니다.
편집 다음은 이러한 방법의 예는 https://gist.github.com/drumsta/16b79cee6bc195cd89c8
2) DB에 어셈블리 .NET을 추가, 닷넷 아주 쉽게이 작업을 수행 할 수 있습니다. 이것은 매우 잘 작동하지만, 단점은 서버 수준에서 여러 매개 변수를 구성 할 필요가 있으며 설정은 쉽게 예를 들면, 고장 데이터베이스를 복원합니다. 나는이 방법을 사용하지만 코드를 소유하지 않기 때문에 나는 그것을 게시 캔트.
-
==============================
8.다음은 일광 절약 차지, UTC 오프셋 및 특정 연도에 고정되지 않는 버전입니다.
다음은 일광 절약 차지, UTC 오프셋 및 특정 연도에 고정되지 않는 버전입니다.
--------------------------------------------------------------------------------------------------- --Name: udfToLocalTime.sql --Purpose: To convert UTC to local US time accounting for DST --Author: Patrick Slesicki --Date: 3/25/2014 --Notes: Works on SQL Server 2008R2 and later, maybe SQL Server 2008 as well. -- Good only for US States observing the Energy Policy Act of 2005. -- Function doesn't apply for years prior to 2007. -- Function assumes that the 1st day of the week is Sunday. --Tests: -- SELECT dbo.udfToLocalTime('2014-03-09 9:00', DEFAULT) -- SELECT dbo.udfToLocalTime('2014-03-09 10:00', DEFAULT) -- SELECT dbo.udfToLocalTime('2014-11-02 8:00', DEFAULT) -- SELECT dbo.udfToLocalTime('2014-11-02 9:00', DEFAULT) --------------------------------------------------------------------------------------------------- ALTER FUNCTION udfToLocalTime ( @UtcDateTime AS DATETIME ,@UtcOffset AS INT = -8 --PST ) RETURNS DATETIME AS BEGIN DECLARE @PstDateTime AS DATETIME ,@Year AS CHAR(4) ,@DstStart AS DATETIME ,@DstEnd AS DATETIME ,@Mar1 AS DATETIME ,@Nov1 AS DATETIME ,@MarTime AS TIME ,@NovTime AS TIME ,@Mar1Day AS INT ,@Nov1Day AS INT ,@MarDiff AS INT ,@NovDiff AS INT SELECT @Year = YEAR(@UtcDateTime) ,@MarTime = CONVERT(TIME, DATEADD(HOUR, -@UtcOffset, '1900-01-01 02:00')) ,@NovTime = CONVERT(TIME, DATEADD(HOUR, -@UtcOffset - 1, '1900-01-01 02:00')) ,@Mar1 = CONVERT(CHAR(16), @Year + '-03-01 ' + CONVERT(CHAR(5), @MarTime), 126) ,@Nov1 = CONVERT(CHAR(16), @Year + '-11-01 ' + CONVERT(CHAR(5), @NovTime), 126) ,@Mar1Day = DATEPART(WEEKDAY, @Mar1) ,@Nov1Day = DATEPART(WEEKDAY, @Nov1) --Get number of days between Mar 1 and DST start date IF @Mar1Day = 1 SET @MarDiff = 7 ELSE SET @MarDiff = 15 - @Mar1Day --Get number of days between Nov 1 and DST end date IF @Nov1Day = 1 SET @NovDiff = 0 ELSE SET @NovDiff = 8 - @Nov1Day --Get DST start and end dates SELECT @DstStart = DATEADD(DAY, @MarDiff, @Mar1) ,@DstEnd = DATEADD(DAY, @NovDiff, @Nov1) --Change UTC offset if @UtcDateTime is in DST Range IF @UtcDateTime >= @DstStart AND @UtcDateTime < @DstEnd SET @UtcOffset = @UtcOffset + 1 --Get Conversion SET @PstDateTime = DATEADD(HOUR, @UtcOffset, @UtcDateTime) RETURN @PstDateTime END GO
-
==============================
9.나는 많은 양의 데이터가있을 때 기능 해제 방법 하나가 너무 느린 것으로 판명. 그래서 시간은 diff의 계산을 허용 할 테이블 함수에 합류 통해했다. 그것은 기본적으로 오프셋 시간과 날짜 부분입니다. 년 4 행 것이다. 테이블 함수 그래서
나는 많은 양의 데이터가있을 때 기능 해제 방법 하나가 너무 느린 것으로 판명. 그래서 시간은 diff의 계산을 허용 할 테이블 함수에 합류 통해했다. 그것은 기본적으로 오프셋 시간과 날짜 부분입니다. 년 4 행 것이다. 테이블 함수 그래서
dbo.fn_getTimeZoneOffsets('3/1/2007 7:00am', '11/5/2007 9:00am', 'EPT')
이 테이블을 반환합니다 :
startTime endTime offset isHr2 3/1/07 7:00 3/11/07 6:59 -5 0 3/11/07 7:00 11/4/07 6:59 -4 0 11/4/07 7:00 11/4/07 7:59 -5 1 11/4/07 8:00 11/5/07 9:00 -5 0
그것은 일광 절약에 대한 계정을하지 않습니다. 그것을 사용하는 방법의 샘플은 이하와 전체 블로그 포스트는 여기에있다.
select mt.startTime as startUTC, dateadd(hh, tzStart.offset, mt.startTime) as startLocal, tzStart.isHr2 from MyTable mt inner join dbo.fn_getTimeZoneOffsets(@startViewUTC, @endViewUTC, @timeZone) tzStart on mt.startTime between tzStart.startTime and tzStart.endTime
-
==============================
10.이들 중 아무도 나를 위해 일한 그러나 이것은 아래의 100 %를했다. 내가처럼 변환하는 노력이 캔 도움말 다른 사람을 바랍니다.
이들 중 아무도 나를 위해 일한 그러나 이것은 아래의 100 %를했다. 내가처럼 변환하는 노력이 캔 도움말 다른 사람을 바랍니다.
CREATE FUNCTION [dbo].[fn_UTC_to_EST] ( @UTC datetime, @StandardOffset int ) RETURNS datetime AS BEGIN declare @DST datetime, @SSM datetime, -- Second Sunday in March @FSN datetime -- First Sunday in November -- get DST Range set @SSM = DATEADD(dd,7 + (6-(DATEDIFF(dd,0,DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 2,0))%7)),DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 2,0))+'02:00:00' set @FSN = DATEADD(dd, (6-(DATEDIFF(dd,0,DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 10,0))%7)),DATEADD(mm,(YEAR(GETDATE())-1900) * 12 + 10,0)) +'02:00:00' -- add an hour to @StandardOffset if @UTC is in DST range if @UTC between @SSM and @FSN set @StandardOffset = @StandardOffset + 1 -- convert to DST set @DST = dateadd(hour,@StandardOffset,@UTC) -- return converted datetime return @DST END
-
==============================
11.
declare @mydate2 datetime set @mydate2=Getdate() select @mydate2 as mydate, dateadd(minute, datediff(minute,getdate(),@mydate2),getutcdate())
-
==============================
12.론의 답변에 오류가 있습니다. 그것은 UTC와 동등한이 필요한 오전 2시 현지 시간을 사용합니다. 나는 아래의 수정 된 버전이 나타납니다 그래서 론의 대답에 대한 언급을 충분히 명성 포인트가 없습니다 :
론의 답변에 오류가 있습니다. 그것은 UTC와 동등한이 필요한 오전 2시 현지 시간을 사용합니다. 나는 아래의 수정 된 버전이 나타납니다 그래서 론의 대답에 대한 언급을 충분히 명성 포인트가 없습니다 :
-- ============================================= -- Author: Ron Smith -- Create date: 2013-10-23 -- Description: Converts UTC to DST -- based on passed Standard offset -- ============================================= CREATE FUNCTION [dbo].[fn_UTC_to_DST] ( @UTC datetime, @StandardOffset int ) RETURNS datetime AS BEGIN declare @DST datetime, @SSM datetime, -- Second Sunday in March @FSN datetime -- First Sunday in November -- get DST Range set @SSM = datename(year,@UTC) + '0314' set @SSM = dateadd(hour,2 - @StandardOffset,dateadd(day,datepart(dw,@SSM)*-1+1,@SSM)) set @FSN = datename(year,@UTC) + '1107' set @FSN = dateadd(second,-1,dateadd(hour,2 - (@StandardOffset + 1),dateadd(day,datepart(dw,@FSN)*-1+1,@FSN))) -- add an hour to @StandardOffset if @UTC is in DST range if @UTC between @SSM and @FSN set @StandardOffset = @StandardOffset + 1 -- convert to DST set @DST = dateadd(hour,@StandardOffset,@UTC) -- return converted datetime return @DST END
-
==============================
13.특정 날짜와 유닉스 에포크 사이의 초 단지 숫자입니다 타임 스탬프 유닉스,
특정 날짜와 유닉스 에포크 사이의 초 단지 숫자입니다 타임 스탬프 유닉스,
SELECT DATEDIFF (SECOND, {D '1970-01-01'}, GETDATE ()) //이 윌 돌아 가기 UNIX 타임 스탬프에서 SQL 서버
당신은 오프셋 나라를 사용하여 유닉스 UTC 변환 현지 날짜 시간 함수를 만들 수 있습니다 유닉스 타임 스탬프에서 SQL 서버로 기능
-
==============================
14.간단 해. 푸른 SQL Server에 대한이 시도 :
간단 해. 푸른 SQL Server에 대한이 시도 :
SELECT YourDateTimeColumn AT TIME ZONE 'Eastern Standard Time' FROM YourTable
현지 SQL Server의 경우 :
SELECT CONVERT(datetime2, SWITCHOFFSET(CONVERT(datetimeoffset, gETDATE()), DATENAME(TzOffset, gETDATE() AT TIME ZONE 'Eastern Standard Time'))) FROM YourTable
-
==============================
15.푸른 SQL 및 @@ 버전의 경우> = SQL 서버 2016 사용자는 아래 AT TIME ZONE를 사용하여 간단한 함수입니다.
푸른 SQL 및 @@ 버전의 경우> = SQL 서버 2016 사용자는 아래 AT TIME ZONE를 사용하여 간단한 함수입니다.
CREATE FUNCTION [dbo].[Global_Convert_UTCTimeTo_LocalTime] ( @LocalTimeZone VARCHAR(50), @UTCDateTime DATETIME ) RETURNS DATETIME AS BEGIN DECLARE @ConvertedDateTime DATETIME; SELECT @ConvertedDateTime = @UTCDateTime AT TIME ZONE 'UTC' AT TIME ZONE @LocalTimeZone RETURN @ConvertedDateTime END GO
@LocalTimeZone가 취할 수있는 값의 유형의 경우,이 링크 또는 이동 KEY_LOCAL_MACHINE \ SOFTWARE \ 마이크로 소프트 \ 윈도우 NT를 \ CurrentVersion \ 시간대로 이동하십시오
-
==============================
16.경고로 - 다음 (주 대신 분의 밀리 초)를 사용하려고하는 경우 :
경고로 - 다음 (주 대신 분의 밀리 초)를 사용하려고하는 경우 :
SELECT DATEADD(ms, DATEDIFF(ms, GETUTCDATE(), GETDATE()), MyTable.UtcColumn) AS ColumnInLocalTime FROM MyTable
DATEDIFF 부분은 항상 같은 번호를 반환하지 않습니다 있음을 유의하십시오. 그래서 밀리 초로 날짜 시간을 비교하는 데 사용하지 마십시오.
-
==============================
17.나는이 기능을 빨리 별도의 테이블 또는 루프를 사용하는 다른 솔루션에 비해 것으로 나타났습니다. 그냥 기본 case 문이다. 4 월과 10 월 사이의 모든 개월 (동부 시간) 오프셋 -4 시간은 우리가 프린지 일 동안 몇 사례 라인을 추가 할 필요가있는 점을 감안. 그렇지 않으면, 오프셋은 -5 시간.
나는이 기능을 빨리 별도의 테이블 또는 루프를 사용하는 다른 솔루션에 비해 것으로 나타났습니다. 그냥 기본 case 문이다. 4 월과 10 월 사이의 모든 개월 (동부 시간) 오프셋 -4 시간은 우리가 프린지 일 동안 몇 사례 라인을 추가 할 필요가있는 점을 감안. 그렇지 않으면, 오프셋은 -5 시간.
이 동부 시간으로 UTC에서 변환 특정이지만, 필요에 따라 추가 시간대 기능을 추가 할 수 있습니다.
USE [YourDatabaseName] GO /****** Object: UserDefinedFunction [dbo].[ConvertUTCtoEastern] Script Date: 11/2/2016 5:21:52 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUNCTION [dbo].[ConvertUTCtoEastern] ( @dtStartDate DATETIME ) RETURNS DATETIME AS BEGIN DECLARE @Working DATETIME DECLARE @Returned DATETIME SET @Working = @dtStartDate SET @Working = case when month(@Working) between 4 and 10 then dateadd(HH,-4,@Working) when @Working between '2017-03-12' and '2017-11-05' then dateadd(HH,-4,@Working) when @Working between '2016-03-13' and '2016-11-06' then dateadd(HH,-4,@Working) when @Working between '2015-03-08' and '2015-11-01' then dateadd(HH,-4,@Working) when @Working between '2014-03-09' and '2014-11-02' then dateadd(HH,-4,@Working) when @Working between '2013-03-10' and '2013-11-03' then dateadd(HH,-4,@Working) when @Working between '2012-03-11' and '2012-11-04' then dateadd(HH,-4,@Working) else dateadd(HH,-5,@Working) end SET @Returned = @Working RETURN @Returned END GO
-
==============================
18.이 DST와 서버 시간을 얻을 수 있어야합니다
이 DST와 서버 시간을 얻을 수 있어야합니다
declare @dt datetime set @dt = getutcdate() -- GMT equivalent
sysdatetimeoffset 계정으로 DST 소요
select [InputTime] = @dt , [LocalTime2] = dateadd(mi, datediff(mi, sysdatetimeoffset(),getdate()), @dt)
-
==============================
19.첫 번째 함수 : 이탈리아어 시간대 (+1, +2), 스위치 날짜를 설정 : 2011 년 3 월, 10 월의 마지막 일요일은 현재 시간대와 같은 날짜 매개 변수 사이의 차이를 리턴한다.
첫 번째 함수 : 이탈리아어 시간대 (+1, +2), 스위치 날짜를 설정 : 2011 년 3 월, 10 월의 마지막 일요일은 현재 시간대와 같은 날짜 매개 변수 사이의 차이를 리턴한다.
Returns: current timezone < parameter timezone ==> +1 current timezone > parameter timezone ==> -1 else 0
코드는 다음과 같습니다
CREATE FUNCTION [dbo].[UF_ADJUST_OFFSET] ( @dt_utc datetime2(7) ) RETURNS INT AS BEGIN declare @month int, @year int, @current_offset int, @offset_since int, @offset int, @yearmonth varchar(8), @changeoffsetdate datetime2(7) declare @lastweek table(giorno datetime2(7)) select @current_offset = DATEDIFF(hh, GETUTCDATE(), GETDATE()) select @month = datepart(month, @dt_utc) if @month < 3 or @month > 10 Begin Set @offset_since = 1 Goto JMP End if @month > 3 and @month < 10 Begin Set @offset_since = 2 Goto JMP End --If i'm here is march or october select @year = datepart(yyyy, @dt_utc) if @month = 3 Begin Set @yearmonth = cast(@year as varchar) + '-03-' Insert Into @lastweek Values(@yearmonth + '31 03:00:00.000000'),(@yearmonth + '30 03:00:00.000000'),(@yearmonth + '29 03:00:00.000000'),(@yearmonth + '28 03:00:00.000000'), (@yearmonth + '27 03:00:00.000000'),(@yearmonth + '26 03:00:00.000000'),(@yearmonth + '25 03:00:00.000000') --Last week of march Select @changeoffsetdate = giorno From @lastweek Where datepart(weekday, giorno) = 1 if @dt_utc < @changeoffsetdate Begin Set @offset_since = 1 End Else Begin Set @offset_since = 2 End End if @month = 10 Begin Set @yearmonth = cast(@year as varchar) + '-10-' Insert Into @lastweek Values(@yearmonth + '31 03:00:00.000000'),(@yearmonth + '30 03:00:00.000000'),(@yearmonth + '29 03:00:00.000000'),(@yearmonth + '28 03:00:00.000000'), (@yearmonth + '27 03:00:00.000000'),(@yearmonth + '26 03:00:00.000000'),(@yearmonth + '25 03:00:00.000000') --Last week of october Select @changeoffsetdate = giorno From @lastweek Where datepart(weekday, giorno) = 1 if @dt_utc > @changeoffsetdate Begin Set @offset_since = 1 End Else Begin Set @offset_since = 2 End End JMP: if @current_offset < @offset_since Begin Set @offset = 1 End Else if @current_offset > @offset_since Set @offset = -1 Else Set @offset = 0 Return @offset END
그런 기능이 변환 날짜
CREATE FUNCTION [dbo].[UF_CONVERT] ( @dt_utc datetime2(7) ) RETURNS datetime AS BEGIN declare @offset int Select @offset = dbo.UF_ADJUST_OFFSET(@dt_utc) if @dt_utc >= '9999-12-31 22:59:59.9999999' set @dt_utc = '9999-12-31 23:59:59.9999999' Else set @dt_utc = (SELECT DATEADD(mi, DATEDIFF(mi, GETUTCDATE(), GETDATE()), @dt_utc) ) if @offset <> 0 Set @dt_utc = dateadd(hh, @offset, @dt_utc) RETURN @dt_utc END
-
==============================
20.- UTC에서 인도 표준 시간을 얻을
- UTC에서 인도 표준 시간을 얻을
CREATE FUNCTION dbo.getISTTime ( @UTCDate datetime ) RETURNS datetime AS BEGIN RETURN dateadd(minute,330,@UTCDate) END GO
-
==============================
21.이것은 함수없이 수행 할 수 있습니다. 코드는 다음과 일광 절약에 대한 회계 산 시간에 UTC 시간을 변환합니다. 모두가 -6 -7 시간대에 숫자가 따라 (즉 EST를 위해 당신이 -4 조정 것 -5 각각) 조정
이것은 함수없이 수행 할 수 있습니다. 코드는 다음과 일광 절약에 대한 회계 산 시간에 UTC 시간을 변환합니다. 모두가 -6 -7 시간대에 숫자가 따라 (즉 EST를 위해 당신이 -4 조정 것 -5 각각) 조정
--Adjust a UTC value, in the example the UTC field is identified as UTC.Field, to account for daylight savings time when converting out of UTC to Mountain time. CASE --When it's between March and November, it is summer time which is -6 from UTC WHEN MONTH ( UTC.Field ) > 3 AND MONTH ( UTC.Field ) < 11 THEN DATEADD ( HOUR , -6 , UTC.Field ) --When its March and the day is greater than the 14, you know it's summer (-6) WHEN MONTH ( UTC.Field ) = 3 AND DATEPART ( DAY , UTC.Field ) >= 14 THEN --However, if UTC is before 9am on that Sunday, then it's before 2am Mountain which means it's still Winter daylight time. CASE WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 AND UTC.Field < '9:00' --Before 2am mountain time so it's winter, -7 hours for Winter daylight time THEN DATEADD ( HOUR , -7 , UTC.Field ) --Otherwise -6 because it'll be after 2am making it Summer daylight time ELSE DATEADD ( HOUR , -6 , UTC.Field ) END WHEN MONTH ( UTC.Field ) = 3 AND ( DATEPART ( WEEKDAY , UTC.Field ) + 7 ) <= DATEPART ( day , UTC.Field ) THEN --According to the date, it's moved onto Summer daylight, but we need to account for the hours leading up to 2am if it's Sunday CASE WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 AND UTC.Field < '9:00' --Before 9am UTC is before 2am Mountain so it's winter Daylight, -7 hours THEN DATEADD ( HOUR , -7 , UTC.Field ) --Otherwise, it's summer daylight, -6 hours ELSE DATEADD ( HOUR , -6 , UTC.Field ) END --When it's November and the weekday is greater than the calendar date, it's still Summer so -6 from the time WHEN MONTH ( UTC.Field ) = 11 AND DATEPART ( WEEKDAY , UTC.Field ) > DATEPART ( DAY , UTC.Field ) THEN DATEADD ( HOUR , -6 , UTC.Field ) WHEN MONTH ( UTC.Field ) = 11 AND DATEPART ( WEEKDAY , UTC.Field ) <= DATEPART ( DAY , UTC.Field ) --If the weekday is less than or equal to the calendar day it's Winter daylight but we need to account for the hours leading up to 2am. CASE WHEN DATEPART ( WEEKDAY , UTC.Field ) = 1 AND UTC.Field < '8:00' --If it's before 8am UTC and it's Sunday in the logic outlined, then it's still Summer daylight, -6 hours THEN DATEADD ( HOUR , -6 , UTC.Field ) --Otherwise, adjust for Winter daylight at -7 ELSE DATEADD ( HOUR , -7 , UTC.Field ) END --If the date doesn't fall into any of the above logic, it's Winter daylight, -7 ELSE DATEADD ( HOUR , -7 , UTC.Field ) END
-
==============================
22.당신은 정확한 시간에 변환뿐만 아니라 문자열을 포맷해야합니다. 이 경우에 나는 줄루 시간을 필요로했다.
당신은 정확한 시간에 변환뿐만 아니라 문자열을 포맷해야합니다. 이 경우에 나는 줄루 시간을 필요로했다.
Declare @Date datetime; Declare @DateString varchar(50); set @Date = GETDATE(); declare @ZuluTime datetime; Declare @DateFrom varchar (50); Declare @DateTo varchar (50); set @ZuluTime = DATEADD(second, DATEDIFF(second, GETDATE(), GETUTCDATE()), @Date); set @DateString = FORMAT(@ZuluTime, 'yyyy-MM-ddThh:mm:ssZ', 'en-US' ) select @DateString;
-
==============================
23.오라클을위한 가장 좋은 방법은 :
오라클을위한 가장 좋은 방법은 :
하드 코딩 된 날짜와 :
SELECT TO_CHAR(CAST((FROM_TZ(CAST(TO_DATE('2018-10-27 21:00', 'YYYY-MM-DD HH24:MI') AS TIMESTAMP), 'UTC') AT TIME ZONE 'EET') AS DATE), 'YYYY-MM-DD HH24:MI') UTC_TO_EET FROM DUAL
결과: 2018년 10월 28일 0시
열 및 테이블 이름 :
SELECT TO_CHAR(CAST((FROM_TZ(CAST(COLUMN_NAME AS TIMESTAMP), 'UTC') AT TIME ZONE 'EET') AS DATE), 'YYYY-MM-DD HH24:MI') UTC_TO_EET FROM TABLE_NAME
-
==============================
24.나는이 같은 변환 사용하여 코드를 할 수 있습니다 UTC 시간을 로컬 및 지역에 UTC을 수행하는 코드가
나는이 같은 변환 사용하여 코드를 할 수 있습니다 UTC 시간을 로컬 및 지역에 UTC을 수행하는 코드가
DECLARE @usersTimezone VARCHAR(32)='Europe/London' DECLARE @utcDT DATETIME=GetUTCDate() DECLARE @userDT DATETIME=[dbo].[funcUTCtoLocal](@utcDT, @usersTimezone)
과
DECLARE @usersTimezone VARCHAR(32)='Europe/London' DECLARE @userDT DATETIME=GetDate() DECLARE @utcDT DATETIME=[dbo].[funcLocaltoUTC](@userDT, @usersTimezone)
기능은 NodaTime에서 제공하는 모든 또는 IANA / TZDB의 시간대의 일부를 지원할 수 - https://nodatime.org/TimeZones에서 전체 목록을 볼
내 유스 케이스 수단이 난 단지 지금부터 5 +/-에 대한 년의 범위 내에서 시대의 전환을 허용하는 '현재'창을 필요로주의하십시오. 당신이 그것으로 인해 지정된 날짜 범위에있는 각 시간대 간격에 대한 코드를 생성하는 방식, 시간의 매우 넓은 기간을 필요로하는 경우이 방법은 아마 사용하신 것으로이 방법은 적합하지 않습니다.
이 프로젝트는 GitHub의에 : https://github.com/elliveny/SQLServerTimeConversion
이것은이 예에 따라 SQL 함수 코드를 생성
-
==============================
25.다음은 계정에 DST 소요 그 하나 간단합니다
다음은 계정에 DST 소요 그 하나 간단합니다
CREATE FUNCTION [dbo].[UtcToLocal] ( @p_utcDatetime DATETIME ) RETURNS DATETIME AS BEGIN RETURN DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), @p_utcDatetime), GETDATE()) END
from https://stackoverflow.com/questions/8038744/convert-datetime-column-from-utc-to-local-time-in-select-statement by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL - 하나 개의 쿼리의 업데이트는 여러 레코드 (0) | 2020.03.18 |
---|---|
[SQL] 어떻게 MySQL의 과정 ORDER BY와 LIMIT 쿼리에합니까? (0) | 2020.03.18 |
[SQL] SQL Server에 대한 "LIKE"와 "IN"을 결합 [중복] (0) | 2020.03.18 |
[SQL] 변수를 할당 할 때 SELECT 대 SET? (0) | 2020.03.18 |
[SQL] IN 값에 대한 반환 기본 결과에 관계없이 (0) | 2020.03.18 |