2011-02-10 39 views
27

Tôi hy vọng sẽ chuyển đổi bảng có trường DATETIMEOFFSET, xuống trường DATETIME NHƯNG tính toán lại thời gian bằng cách chú ý đến bù trừ. Điều này, có hiệu lực, chuyển đổi giá trị thành UTC.Làm cách nào để chuyển đổi Sql Server 2008 DateTimeOffset thành DateTime

ví dụ:

CreatedOn: 2008-12-19 17:30:09.0000000 +11:00

đó sẽ được chuyển đổi để

CreatedOn: 2008-12-19 06:30:09.0000000

hoặc

CreatedOn: 2008-12-19 06:30:09.0000000 + 00:00 < - đó là một DATETIMEOFFSET, nhưng UTC.

Cheers :)

Trả lời

45

Chuyển đổi sử dụng hầu hết các phong cách sẽ làm cho giá trị datetime2 được chuyển đổi sang UTC.
Ngoài ra, chuyển đổi từ datetime2 để DateTimeOffset chỉ đơn giản là thiết lập bù đắp tại +00:00, theo dưới đây, vì vậy nó là một cách nhanh chóng để chuyển đổi từ Datetimeoffset(offset!=0) để Datetimeoffset(+00:00)

declare @createdon datetimeoffset 
set @createdon = '2008-12-19 17:30:09.1234567 +11:00' 

select CONVERT(datetime2, @createdon, 1) 
--Output: 2008-12-19 06:30:09.12 

select convert(datetimeoffset,CONVERT(datetime2, @createdon, 1)) 
--Output: 2008-12-19 06:30:09.1234567 +00:00 
+1

Có thể giải thích đối số cuối cùng "1" của CONVERT có nghĩa là gì không? Tất cả các ví dụ của đối số này sử dụng các loại ký tự như đầu ra hoặc kiểu đầu vào. Ở đây chúng ta chuyển đổi datetimeoffset thành datetime. –

+0

Hàm 'convert()' có tham số thứ 3 xác định định dạng cho đầu ra. [https://www.w3schools.com/sql/func_convert.asp](https://www.w3schools.com/sql/func_convert.asp). 1 = "mm/dd/yy" định dạng –

+0

Đối số thứ ba đó thực sự không có ý nghĩa gì đối với chuyển đổi từ 'datetimeoffset' thành' datetime2'. Đó là cho các chuyển đổi 'varchar'. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql (cũng là W3Schools? nhiều tùy chọn tốt hơn bây giờ!) – brianary

3

Lưu ý: Những thông tin múi giờ là bỏ trong chuyển đổi nếu không có phong cách ("126" ở đây) được chỉ định. Nó cũng có thể bị loại bỏ theo một số phong cách khác, tôi không biết - trong bất kỳ trường hợp nào sau đây điều chỉnh chính xác cho thông tin TZ. Xem CAST and CONVERT.

select convert(datetime, cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset), 126) as utc; 

Chúc mừng SQL'ing.

Sửa

Không chắc chắn nếu nó quan trọng nhưng ... datetime có thể không thực sự lưu trữ rằng mức độ chính xác/độ chính xác. Nếu ở trên chạy các giây phân số sẽ được cắt ngắn thành 3 chữ số (và độ chính xác nhỏ hơn số đó). Điều này cũng tương tự với-datetime2 (và datetimeoffset(7)) tạo ra một không cắt ngắn giá trị:

select convert(datetime2, cast('2008-12-19 17:30:09.1234567 +11:00' as datetimeoffset(7)), 126) as utc; 
+0

phong cách 126 là gì? và tại sao 126? –

+0

@ Pure.Krome Xem liên kết tới CAST và CONVERT trong thư trả lời. 126 vì tôi thích ISO 8601 và phải chọn một. Nó thực sự không khác gì so với việc chọn cyberwiki 1. Như đã lưu ý (trong cả hai câu trả lời) một số kiểu * có thể * không tính đến TZ. –

+1

Một thử nghiệm nhanh trong SQL Server 2008 R2 cho thấy rằng chỉ sử dụng kiểu '0' hoặc (tương đương) bỏ qua mã kiểu bỏ đi thông tin múi giờ. Bất kỳ mã nào khác được liệt kê trong tài liệu MSDN sẽ giữ nguyên. –

17

Tôi muốn sử dụng được xây dựng trong tùy chọn SQL:

select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00') 
9

Tôi biết đây là câu hỏi cũ nhưng nếu bạn muốn chuyển đổi DateTimeOffset thành DateTime, tôi nghĩ bạn cần tính đến múi giờ của máy chủ bạn đang chuyển đổi. Nếu bạn chỉ làm một CONVERT (datetime, @MyDate, 1), bạn sẽ chỉ mất múi giờ, điều này có thể dẫn đến việc chuyển đổi không chính xác.

Tôi nghĩ trước tiên bạn cần chuyển đổi giá trị bù đắp của giá trị DateTimeOffset, sau đó thực hiện chuyển đổi.

DECLARE @MyDate DATETIMEOFFSET = '2013-11-21 00:00:00.0000000 -00:00'; 
SELECT CONVERT(DATETIME, SWITCHOFFSET(@MyDate, DATEPART(tz,SYSDATETIMEOFFSET()))); 

Kết quả chuyển đổi '2013-11-21 00: 00: 00.0000000 -00: 00' thành Ngày giờ trên máy chủ bị bù trừ là -7: 00 sẽ là 2013-11-20 17:00 : 00.000. Với logic trên, nó không có nghĩa là múi giờ của máy chủ hoặc giá trị offset của giá trị DateTime, nó sẽ được chuyển đổi thành DateTime trong múi giờ của máy chủ.

Tôi tin rằng bạn cần thực hiện điều này vì giá trị Ngày giờ bao gồm giả định rằng giá trị nằm trong múi giờ của máy chủ.

+0

Cảm ơn vì điều này - chúng tôi đã chạy nhiều mã hơn trong Azure ngay bây giờ nhưng truy vấn cơ sở dữ liệu tại chỗ, thật tuyệt khi có thể lấy DateTimeOffset trong đám mây, thường là UTC, rồi chuyển đổi nó thành giờ địa phương mà không cần phải biết múi giờ máy chủ cục bộ. Sử dụng DateTimeOffeset trong đám mây cũng cách ly chúng ta nếu đám mây không phải là UTC. –

Các vấn đề liên quan