2014-04-06 15 views
9

Vì vậy, đây là VERY lạ. RODBC dường như giảm phần thời gian của các cột SQL DateTime nếu tập kết quả đủ lớn. (Các truy vấn đang chạy trên máy SQL Server 2012 và, có, khi tôi chạy chúng ở phía máy chủ SQL, chúng tạo ra kết quả giống hệt nhau và phù hợp, bất kể số hàng được trả về.)RODBC mất giá trị thời gian của datetime khi tập hợp kết quả lớn

Ví dụ: hoạt động hoàn hảo:

myconn <- odbcConnect(dsnName, uid, pwd) 
results <- sqlQuery(myconn, "SELECT TOP 100 MyID, MyDateTimeColumn from MyTable ORDER BY MyDateTimeColumn DESC") 
close(myconn) 

Trong R, các công việc sau như mong đợi:

> results$MyDateTimeColumn[3] 
[1] "2013-07-01 00:01:22 PDT" 

đó là một thời gian POSIXct ngày hợp lệ. Tuy nhiên, khi ở đâu đó giữa 10.000 và 100.000 hàng được trả về, đột nhiên phần thời gian biến mất:

myconn <- odbcConnect(dsnName, uid, pwd) 
bigResults <- sqlQuery(myconn, "SELECT TOP 100000 MyID, MyDateTimeColumn from MyTable ORDER BY MyDateTimeColumn DESC") 
close(myconn) 

(cùng một mã, chỉ cần một số lượng lớn hàng trả lại; LƯU Ý: các chính xác cùng hàng giờ đây đã bị mất thành phần thời gian của mình), R đáp ứng:

> bigResults$MyDateTimeColumn[3] 
[1] "2013-07-01 PDT" 

Lưu ý rằng thời gian tại là thiếu (đây không phải là một dãy ghế khác; đó là chính xác cùng hàng như previo chúng ta), như các chương trình sau:

>strptime(results$TriggerTime[3], "%Y-%m-%d %H:%M:%S") 
[1] "2013-07-01 00:01:22" 

>strptime(bigResults$TriggerTime[3], "%Y-%m-%d %H:%M:%S") 
[1] NA 

Rõ ràng công việc xung quanh hoặc là gia tăng truy vấn-với-append hoặc xuất khẩu sang CSV-and-nhập-to-R, nhưng điều này có vẻ rất kỳ quặc. Bất cứ ai từng thấy bất cứ điều gì như thế này?

Cấu hình: Tôi đang sử dụng phiên bản RODBC mới nhất (1.3-10) và có thể sao chép hành vi trên cả bản cài đặt R chạy trên Windows x64 và cài đặt R chạy trên Mac OS X 10.9 (Mavericks).

EDIT # 2 Thêm đầu ra của dput() để so sánh các đối tượng, theo yêu cầu:

> dput(results[1:10,]$MyDateTimeColumn) 
structure(c(1396909903.347, 1396909894.587, 1396909430.903, 1396907996.9, 1396907590.02, 1396906077.887, 1396906071.99, 1396905537.36, 1396905531.413, 1396905231.787), class = c("POSIXct", "POSIXt"), tzone = "") 

> dput(bigResults[1:10,]$MyDateTimeColumn) 
structure(c(1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000, 1396854000), class = c("POSIXct", "POSIXt"), tzone = "") 

Nó sẽ xuất hiện mà các dữ liệu cơ bản được thực sự thay đổi như là kết quả của số hàng trả lại do truy vấn, đó là hết sức kỳ lạ.

+0

có lẽ thử [RJDBC] (http://cran.r-project.org/web/packages/RJDBC/index.html)? –

+0

Trong trường hợp đó là rõ ràng đối với người khác, " không có thời gian "dấu thời gian bắt đầu trong ngày cho múi giờ +0700 GMT. Vậy, là db ở Campuchia, Indonesia, Thái Lan, Việt Nam (hoặc có thể là một số người khác)? db phụ trợ thực sự lưu trữ thông tin này như thế nào (số nguyên so với float so với chuỗi), là thời gian một phần riêng biệt từ thông tin ngày nội bộ ? Bởi vì nếu không thì db phải làm _more_ để làm việc này, điều này là ** người lạ **. Hoặc có lẽ chỉ loại trả về là khác nhau? –

+0

bất kỳ câu trả lời cho điều này xin vui lòng? cùng một vấn đề ở đây. trường được lưu trữ dưới dạng datetime trong SQL và RODBC lưu trữ nó dưới dạng posixct nhưng loại bỏ dấu thời [email protected] JoshuaUlrich tôi không thể sử dụng RJDBC cho trường hợp của tôi vì nó lưu trữ trường dưới dạng ký tự và nó làm cho việc phân loại theo trường này chậm hơn rất nhiều. tôi cũng có rất nhiều dữ liệu và quá trình chuyển đổi cũng mất quá nhiều thời gian. bất kỳ ý tưởng xin vui lòng? cảm ơn bạn! – charliealpha

Trả lời

0

Đây có thể là sự cố tiết kiệm ánh sáng ban ngày. Nếu có một thời gian không tồn tại trong múi giờ của bạn (vì tiết kiệm ánh sáng ban ngày) nó có thể gây ra một cái gì đó như thế này.

+0

umm, không. Khi DST tấn công, nó không _remove_ thời gian, nó thay đổi giá trị báo cáo (giờ địa phương). Hầu hết các hệ thống lưu trữ thời gian như một bộ đếm gia tăng - DST không thay đổi giá trị này, nó chỉ đơn giản là báo cáo những thứ như một giờ (hoặc bất kỳ) khác nhau. Sự khác biệt về giá trị là ** xa ** nhiều hơn một giờ sane (lần đầu tiên là 15 giờ, cộng thêm vài phút và giây). Vì vậy, tôi mong đợi để xem phần _some_ thời gian, ngay cả khi nó là '00: 00: 00'. –

5

sqlQuery() có tùy chọn được gọi là as.is. Đặt cài đặt này thành TRUE sẽ kéo mọi thứ như được thấy trong ví dụ như Microsoft SQL Management Studio.

+0

Không, trả lại giá trị giờ của năm (8760) sẽ loại bỏ thành phần thời gian khỏi trường ngày giờ của tôi (không phải tất cả các trường datetime, chỉ là trường tôi quan tâm nhất [dĩ nhiên]). Nếu tôi trả về TOP (3) hàng, sau đó tôi đã có thành phần thời gian của tôi bất kể làm thế nào tôi đặt "as.is" trong sqlQuery() của tôi gọi. –

0

Tôi nghĩ đây là trường hợp bị xóa khỏi những ngày mà phạm vi ngày bao gồm chuyển đến/từ thời gian tiết kiệm ánh sáng ban ngày. Nếu bạn chọn thời gian không bao gồm ca tiết kiệm ánh sáng ban ngày, thời gian sẽ được giữ lại (ví dụ, từ 1/1/2007 đến 3/1/2007. Điều này có thể tránh được bằng cách thay đổi thời gian hệ thống trên máy tính của bạn để theo dõi một múi giờ (ví dụ, Arizona), nơi không có sự thay đổi tiết kiệm ánh sáng ban ngày (âm thanh kỳ quái, nhưng nó đã làm việc cho tôi)

Để khắc phục vấn đề này, hãy nhập DateTimes làm ký tự (sử dụng "as."" và sau đó chuyển đổi chúng sang POSIXct. Bạn có thể sử dụng "strptime" để chuyển đổi thành POSIXlt và cho phép bạn chỉ định định dạng. Đây là ví dụ về truy vấn SQL trong đó DateTimes được nhập as.is (TRUE), nhưng dữ liệu liên kết không (FALSE) và sau đó là DateTime được chuyển đổi sang một định dạng ngày R:.

data <- sqlQuery(channel, paste("SELECT LocalDateTime, DataValue FROM DataValues WHERE LocalDateTime >= '1/1/2007 0:00' AND LocalDateTime < '1/1/2008 0:00' ORDER BY LocalDateTime ASC"),as.is=c(TRUE,FALSE)) 

data$LocalDateTime <- as.POSIXct(totalP$LocalDateTime,tz="MST") 
2

tôi đối phó với những vấn đề tương tự cũng Thậm chí người lạ, trên một tập dữ liệu lớn một cột sẽ nhập cả ngày và thời gian khác cột chỉ nhập khẩu ngày.

lời khuyên của tôi sẽ được chia dữ liệu/thời gian trong SQL

myconn <- odbcConnect(dsnName, uid, pwd) 
results <- sqlQuery(myconn, "SELECT TOP 100 MyID, format(MyDateTimeColumn,"HH:mm:ss") as MyTimeColumn,format(MyDateTimeColumn,"yyyy-MM-dd") as MyDateColumn from MyTable ORDER BY MyDateTimeColumn DESC") 
close(myconn) 

Sau đó, kết hợp chúng trong R sau đó. Hy vọng nó giúp.

0

tôi đã cùng một vấn đề và kết luận rằng đó là do DST:

này thất bại: as.POSIXct(c("2015-03-29 01:59:22", "2015-03-29 02:00:04"))

này hoạt động: as.POSIXct(c("2015-03-29 01:59:22", "2015-03-29 02:00:04"), tz="UTC")

tôi không thể tìm cách để buộc tz =" UTC "trong hành vi RODBC mặc định, tuy nhiên sử dụng as.is = TRUE và tự chuyển đổi cột thành công việc.

Lưu ý: Lúc đầu tôi có ấn tượng rằng đó là do kết quả rất lớn, nhưng thực tế là do thực tế là trong kết quả rất lớn, tôi có nhiều cơ hội hơn để vượt qua các cập nhật DST.

0

Đây là câu hỏi cũ hơn, nhưng tôi đã gặp sự cố tương tự khi cố gắng đọc theo chương trình dữ liệu từ 15 khác nhau .accdb. Tất cả các trường POSIXct được đọc chính xác cho mọi cơ sở dữ liệu ngoại trừ các trường từ tháng 3, từ đó tôi phỏng đoán rằng nó một số loại vấn đề thời gian tiết kiệm ánh sáng ban ngày.

Giải pháp cho tôi (vì tôi không muốn phải làm nhiều truy vấn đến một dB và sau đó tất cả mọi thứ rbind() với nhau) đã làm thay đổi chức năng của tôi để bao gồm các dòng

#Get initial tz 
current_tz <- Sys.timezone() 
Sys.setenv(TZ = "America/Phoenix") 

[BODY OF FUNCTION] 

Sys.setenv(TZ = curent_tz) 

Sau đó có những vài dòng, các trường ngày/giờ từ cơ sở dữ liệu tháng ba đã được đọc chính xác.

0

Tại sao điều này xảy ra trên các tập dữ liệu lớn được trả về từ sqlQuery()? Tôi không biết. Nhưng đã có thể workaround nó bằng cách áp dụng một chuyển đổi sql trong cuộc gọi sql:

dữ liệu < - sqlquery (kênh, "SELECT CONVERT (nvarchar (24), DtTimeField, 21) AS HourDt, * FROM ...

Đây là cách giải quyết của bạn.

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