Chuyển đổi DateTime với Thời gian thập phân dài hơn 3 chữ số?


3

Tôi đang cố gắng nhập một số dữ liệu từ CSV vào Máy chủ MS SQL 2008. Tôi đang sử dụng Invoke-SQL của PowerShell và tập lệnh SQL sử dụng BULK INSERT.

Các trường CSV được nhập dưới dạng VarChars và tôi đang cố gắng chỉ định kiểu dữ liệu.

Trong dữ liệu được cung cấp trong CSV (mà tôi không thể kiểm soát), một số trường datetime có ngày / giờ theo định dạng này:

2012-03-15 15:10:08.920000000

Thông thường tôi chỉ sử dụng ALTER và để SQL chuyển đổi nó, và thường thì nó hoạt động ... ví dụ:

ALTER TABLE [dbo].[ImportData] ALTER COLUMN [PlanSetupDate] datetime null;

nhưng, khi nó chạm vào một trong các DateTimes như trên, nó không thành công với thông báo lỗi:

Chuyển đổi không thành công khi chuyển đổi ngày và / hoặc thời gian từ chuỗi ký tự.

Tiếp theo, tôi đã thử Chuyển đổi của SQL:

Select Convert(datetime, '2012-03-15 15:10:08.920000000')

Nhưng tôi nhận được thông báo lỗi tương tự như khi sử dụng ALTER.

Nếu tôi cắt bỏ các vị trí thập phân thêm (để lại ba hoặc ít hơn), chuyển đổi hoạt động như mong đợi, ví dụ:

2012-03-15 15:10:08.920

Tôi không thể chỉ cắt ngắn các nhân vật X mới nhất từ lĩnh vực này trước khi chuyển đổi, bởi vì hầu hết các của datetime khác trong cột là định dạng truyền thống hơn như 2010-01-05 00:00:00.

Trong khi tôi muốn giữ nó, phần thời gian thực sự không quan trọng lắm, chắc chắn không có gì sau số thập phân. Vì vậy, nếu giải pháp chuyển đổi nó đòi hỏi phải cắt nó ở mức thập phân, thì tốt thôi. :)

Tôi luôn có thể sửa đổi CSV trước khi nhập nó vào SQL thông qua PowerShell hoặc tương tự, nhưng tôi muốn thực hiện tất cả việc xử lý dữ liệu của mình trong SQL, nếu có thể.

Vì vậy, có cách nào để chuyển đổi định dạng datetime có vấn đề này bằng truy vấn SQL không?


3
Bạn đã thử sử dụng DATETIME2 chưa? Theo mặc định, giây chính xác đến 7 nơi.
BillP3

2
Bạn đã cân nhắc sử dụng datetime2thay vì datetime? Datetime chỉ giữ 3 chữ số trong vài giây qua, datetime2 giữ tối đa 7 chữ số.
Scott Chamberlain

Hmmm datetime2 là một cái mới đối với tôi. Có lẽ đó là đặt cược tốt nhất sau tất cả. Ok tôi đã kiểm tra nó và nó hoạt động trong ví dụ chuyển đổi của tôi - tốt đẹp! Hiện tại tôi đang rất ít thời gian, vì vậy tôi không thể kiểm tra nó bằng ALTER (đó là sở thích của tôi cho những gì tôi đang làm) ngay lúc này, nhưng nếu nó hoạt động (mà tôi hoàn toàn mong đợi thì tôi sẽ hạnh phúc) chấp nhận đó là câu trả lời, nếu ai đó muốn viết nó chính thức. :)
cʜιᴇ007

2
PS: đây là câu hỏi SU đầu tiên của tôi. :)
cʜιᴇ007

Câu trả lời:


2

DATETIME2là kiểu dữ liệu SQL mà bạn đang tìm kiếm. Phải mất vài giây chính xác đến 7 chữ số thập phân. TechNet cung cấp thông tin đầy đủ, với các ví dụ so sánh các loại khác nhau ở đây .

Sau đây sẽ cung cấp cho bạn những điều cơ bản liên quan đến tất cả các loại áp dụng:

SELECT 
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date' 
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 'smalldatetime' 
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 'datetime2'
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 'datetimeoffset';

Tạo ra kết quả:

Data type       Output
time            12:35:29. 1234567
date            2007-05-08
smalldatetime   2007-05-08 12:35:00
datetime        2007-05-08 12:35:29.123
datetime2       2007-05-08 12:35:29.1234567
datetimeoffset  2007-05-08 12:35:29.1234567 +12:15

Truy vấn trên và kết quả được lấy trực tiếp từ trang TechNet được trích dẫn ở trên.

NB Tôi tin rằng DATETIME2lần đầu tiên xuất hiện trong SQL 2008.


Tại sao điều này là trong Superuser?
Rafael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.