날짜 시간을 날짜 시간 오프셋으로 캐스팅하는 방법은 무엇입니까?
SQL Server를 변환하는 방법datetime에 가치를 두는.datetimeoffset가치?
예를 들어, 기존 테이블은 다음을 포함합니다.datetime모두 "로컬" 서버 시간에 있는 값입니다.
SELECT TOP 5 ChangeDate FROM AuditLog
ChangeDate
=========================
2013-07-25 04:00:03.060
2013-07-24 04:00:03.073
2013-07-23 04:00:03.273
2013-07-20 04:00:02.870
2013-07-19 04:00:03.780
서버(현재, 현재)가 UTC보다 4시간 늦어지고 있습니다(현재, 미국 동부 표준시, 일광 절약 시간제 활성화).
SELECT SYSDATETIMEOFFSET()
2013-07-25 14:42:41.6450840 -04:00
저장된 것을 변환하고 싶습니다.datetime에 대한 가치.datetimeoffset값. 서버의 현재 표준 시간대 오프셋 정보를 사용합니다.
원하는 값은 다음과 같습니다.
ChangeDate ChangeDateOffset
======================= ==================================
2013-07-25 04:00:03.060 2013-07-25 04:00:03.0600000 -04:00
2013-07-24 04:00:03.073 2013-07-24 04:00:03.0730000 -04:00
2013-07-23 04:00:03.273 2013-07-23 04:00:03.2730000 -04:00
2013-07-20 04:00:02.870 2013-07-20 04:00:02.8700000 -04:00
2013-07-19 04:00:03.780 2013-07-19 04:00:03.7800000 -04:00
바람직한 특성을 확인할 수 있습니다.
2013-07-19 04:00:03.7800000 -04:00
\_________________________/ \____/
| |
a "local" datetime the offset from UTC
그러나 실제 값은 다음과 같습니다.
SELECT TOP 5
ChangeDate,
CAST(ChangeDate AS datetimeoffset) AS ChangeDateOffset
FROM AuditLog
ChangeDate ChangeDateOffset
======================= ==================================
2013-07-25 04:00:03.060 2013-07-25 04:00:03.0600000 +00:00
2013-07-24 04:00:03.073 2013-07-24 04:00:03.0730000 +00:00
2013-07-23 04:00:03.273 2013-07-23 04:00:03.2730000 +00:00
2013-07-20 04:00:02.870 2013-07-20 04:00:02.8700000 +00:00
2013-07-19 04:00:03.780 2013-07-19 04:00:03.7800000 +00:00
잘못된 특성을 가진 경우:
2013-07-19 04:00:03.7800000 +00:00
\_________________________/ \____/
^
|
No offset from UTC present
그래서 저는 무작위로 다른 것들을 시도합니다.
SELECT TOP 5
ChangeDate,
CAST(ChangeDate AS datetimeoffset) AS ChangeDateOffset,
DATEADD(minute, DATEDIFF(minute, GETDATE(), GETUTCDATE()), ChangeDate) AS ChangeDateUTC,
CAST(DATEADD(minute, DATEDIFF(minute, GETDATE(), GETUTCDATE()), ChangeDate) AS datetimeoffset) AS ChangeDateUTCOffset,
SWITCHOFFSET(CAST(ChangeDate AS datetimeoffset), DATEDIFF(minute, GETUTCDATE(), GETDATE())) AS ChangeDateSwitchedOffset
FROM AuditLog
ORDER BY ChangeDate DESC
결과 포함:
ChangeDate ChangeDateOffset ChangeDateUTC ChangeDateUTCOffset ChangeDateSwitchedOffset
======================= ================================== ======================= ================================== ==================================
2013-07-25 04:00:03.060 2013-07-25 04:00:03.0600000 +00:00 2013-07-25 08:00:03.060 2013-07-25 08:00:03.0600000 +00:00 2013-07-25 00:00:03.0600000 -04:00
2013-07-24 04:00:03.073 2013-07-24 04:00:03.0730000 +00:00 2013-07-24 08:00:03.073 2013-07-24 08:00:03.0730000 +00:00 2013-07-24 00:00:03.0730000 -04:00
2013-07-23 04:00:03.273 2013-07-23 04:00:03.2730000 +00:00 2013-07-23 08:00:03.273 2013-07-23 08:00:03.2730000 +00:00 2013-07-23 00:00:03.2730000 -04:00
2013-07-20 04:00:02.870 2013-07-20 04:00:02.8700000 +00:00 2013-07-20 08:00:02.870 2013-07-20 08:00:02.8700000 +00:00 2013-07-20 00:00:02.8700000 -04:00
2013-07-19 04:00:03.780 2013-07-19 04:00:03.7800000 +00:00 2013-07-19 08:00:03.780 2013-07-19 08:00:03.7800000 +00:00 2013-07-19 00:00:03.7800000 -04:00
---------------------------------- ---------------------------------- ----------------------------------
No UTC offset Time in UTC No UTC offset Time all wrong
원하는 값을 반환하지 않습니다.
제가 직관적으로 원하는 것을 돌려주는 것을 제안할 수 있는 사람이 있습니까?
편집: SQL Server 2016에 대해 더 나은 답변 업데이트
SELECT
ChangeDate, --original datetime value
ChangeDate AT TIME ZONE 'Eastern Standard Time' AS ChangeDateOffset
FROM AuditLog
그AT TIME ZONE일광 절약 시간제가 변환되는 날짜에 적용되었는지 여부를 고려합니다.또한 "동부 표준시"에 "표준"이라고 표시되어 있지만 일광 절약 시간도 제공합니다.
ChangeDate ChangeDateOffset
----------------------- ------------------------------
2019-01-21 09:00:00.000 2019-01-21 09:00:00.000 -05:00
2019-02-21 09:00:00.000 2019-02-21 09:00:00.000 -05:00
2019-03-21 09:00:00.000 2019-03-21 09:00:00.000 -04:00 <-- savings time
2019-04-21 09:00:00.000 2019-04-21 09:00:00.000 -04:00 <-- savings time
2019-05-21 09:00:00.000 2019-05-21 09:00:00.000 -04:00 <-- savings time
2019-06-21 09:00:00.000 2019-06-21 09:00:00.000 -04:00 <-- savings time
2019-07-21 09:00:00.000 2019-07-21 09:00:00.000 -04:00 <-- savings time
2019-08-21 09:00:00.000 2019-08-21 09:00:00.000 -04:00 <-- savings time
2019-09-21 09:00:00.000 2019-09-21 09:00:00.000 -04:00 <-- savings time
2019-10-21 09:00:00.000 2019-10-21 09:00:00.000 -04:00 <-- savings time
2019-11-21 09:00:00.000 2019-11-21 09:00:00.000 -05:00
2019-12-21 09:00:00.000 2019-12-21 09:00:00.000 -05:00
문자열의 하드 코딩을 방지하는 방법은 무엇입니까?Eastern Standard Time서버의 현재 시간대를 사용하시겠습니까?당신은 SOL입니다.
원래 SQL Server 2016 이전 답변
난 이해했다.여기에는 임의의 오프셋 정보를 제공된 모든 데이터에 첨부하는 SQL Server 기능이 내장되어 있습니다.datetime.
예를 들어 동일한 쿼리는 다음과 같습니다.
SELECT ToDateTimeOffset('2013-07-25 15:35:27', -240) -- -240 minutes
SELECT ToDateTimeOffset('2013-07-25 15:35:27', '-04:00') -- -4 hours
두 반환 모두:
2013-07-25 15:35:27.0000000 -04:00
참고: 오프셋 매개 변수:ToDateTimeOffset다음 중 하나일 수 있습니다.
- 하나의
integer분 수를 나타내는 - a
string시간 및 분을 나타냅니다(단위).{+|-}TZH:THM형식)
서버의 현재 UTC 오프셋이 필요합니다.
다음으로 UTC에서 서버의 현재 오프셋이 필요합니다.SQL Server가 반환하도록 할 수 있는 두 가지 방법이 있습니다.integerUTC에서 출발한 시간(분):
DATEPART(TZOFFSET, SYSDATETIMEOFFSET())
DATEDIFF(minute, GETUTCDATE(), GETDATE())
쌍방의 이익
-240
이 플러그를 에 꽂는 것.TODATETIMEOFFSET함수:
SELECT ToDateTimeOffset(
'2013-07-25 15:35:27',
DATEPART(TZOFFSET, SYSDATETIMEOFFSET()) --e.g. -240
)
를 반환합니다.datetimeoffset원하는 값:
2013-07-25 15:35:27.0000000 -04:00
종합하면,
이제 날짜 시간을 날짜 시간 오프셋으로 변환하는 더 나은 기능을 사용할 수 있습니다.
CREATE FUNCTION dbo.ToDateTimeOffset(@value datetime2)
RETURNS datetimeoffset AS
BEGIN
/*
Converts a date/time without any timezone offset into a datetimeoffset value,
using the server's current offset from UTC.
For this we use the built-in ToDateTimeOffset function;
which attaches timezone offset information with a datetimeoffset value.
The trick is to use DATEDIFF(minutes) between local server time and UTC
to get the offset parameter.
For example:
DATEPART(TZOFFSET, SYSDATETIMEOFFSET())
returns the integer
-240
for people in EDT (Eastern Daylight Time), which is 4 hours (240 minutes) behind UTC.
Pass that value to the SQL Server function:
TODATETIMEOFFSET(@value, -240)
*/
RETURN TODATETIMEOFFSET(@value, DATEPART(TZOFFSET, SYSDATETIMEOFFSET()))
END;
샘플사용량
SELECT TOP 5
ChangeDate,
dbo.ToDateTimeOffset(ChangeDate) AS ChangeDateOffset
FROM AuditLog
원하는 값을 반환합니다.
ChangeDate ChangeDateOffset
======================= ==================================
2013-07-25 04:00:03.060 2013-07-25 04:00:03.0600000 -04:00
2013-07-24 04:00:03.073 2013-07-24 04:00:03.0730000 -04:00
2013-07-23 04:00:03.273 2013-07-23 04:00:03.2730000 -04:00
2013-07-20 04:00:02.870 2013-07-20 04:00:02.8700000 -04:00
2013-07-19 04:00:03.780 2013-07-19 04:00:03.7800000 -04:00
기본 제공 기능이 다음과 같은 작업을 수행했다면 이상적이었을 것입니다.
TODATETIMEOFFSET(value)
"문서"를 작성할 필요가 없습니다.
dbo.ToDateTimeOffset(value)
참고: 모든 코드는 공용 도메인으로 릴리스됩니다.속성이 필요하지 않습니다.
현재 시간 오프셋을 사용하여 로컬 시간에서 날짜 시간 오프셋으로 변환하려면 약간의 속임수가 필요한 것 같습니다.더 간단한 방법이 있을 수도 있지만, 이것은 그것을 해내는 것처럼 보입니다.
SELECT ChangeDate,
CONVERT(DATETIMEOFFSET, CONVERT(VARCHAR, ChangeDate, 120) +
RIGHT(CONVERT(VARCHAR, SYSDATETIMEOFFSET(), 120), 6), 120)
FROM AuditLog;
함수를 생성할 가치가 있습니다.
CREATE FUNCTION LOCALIFY(@dt DATETIME)
RETURNS DATETIMEOFFSET AS
BEGIN
RETURN CONVERT(DATETIMEOFFSET,
CONVERT(VARCHAR, @dt, 120) +
RIGHT(CONVERT(VARCHAR, SYSDATETIMEOFFSET(), 120), 6), 120)
END;
...그리고 나서 그냥...
SELECT ChangeDate, dbo.LOCALIFY(ChangeDate) FROM AuditLog;
이지만, 이 스레드는 하는 방법을 하는 데 .datetimedatetimeoffset.
기능을 이 " 일기능사용만기지본다이설음필사것제다용니안합을할드를정로된부으값했을▁with"로 설정된 하는 것을 합니다.sysdatetimeoffset()항목이 삽입되었을 때(현재 타임스탬프) 항목이 삽입되었을 때와 관련되도록 합니다.그런 다음 수정이 필요한 경우 업데이트는 절차에서 소스의 TZ를 활용할 수 있습니다.
이는 특히 OData v4 트랜잭션에서 명확하게 드러났으며, 이를 위해서는datetimeoffset.
저는 당신이 그것을 곱해야 한다고 생각합니다.DATEPART(TZOFFSET,SYSDATETIMEOFFSET())타고-1정확한 시간대 오프셋을 얻기 위해.동부 표준 시간대에 있는 경우 표준 시간대 오프셋은 -4:00이 아니라 +4:00이어야 합니다.내 로컬 서버에서 UTC로 오프셋입니까, 아니면 UTC에서 로컬 서버로 오프셋입니까?
언급URL : https://stackoverflow.com/questions/17866311/how-to-cast-datetime-to-datetimeoffset
'programing' 카테고리의 다른 글
| 특정 스키마에서 데이터베이스의 모든 테이블 내에서 열 이름을 검색하는 방법 (0) | 2023.08.08 |
|---|---|
| Android:스크롤 뷰 대 중첩 스크롤 뷰 (0) | 2023.08.08 |
| Babel 7로 업그레이드: null의 '바인딩' 속성을 읽을 수 없습니다. (0) | 2023.08.08 |
| Python의 CURL 대안 (0) | 2023.08.08 |
| 파일에 대한 Oracle 스풀의 최대 열 너비 (0) | 2023.08.08 |