R dan SQL: Mengimpor tanggal dan waktu dari SQL ke R

Saya mengimpor data dari SQL ke R. Data tersebut berisi kolom dalam format DateTime di SQL dengan tanggal dalam format berikut: 2014-10-01 13:00:05. Namun, ketika saya mengimpor data ini ke R menggunakan paket RODBC, kolom di R diformat ke tipe data POSIXct dan menampilkan kolom sebagai berikut: 2014-10-01 yaitu tidak berisi jam, menit, atau detik.

Adakah yang tahu cara mengimpor dari SQL ke R dan mengatur jam, menit, dan detik?

Tolong beri tahu saya jika saya perlu menambahkan sesuatu ke pertanyaan untuk memperjelas lebih lanjut.

Terima kasih

Mike


person Mike    schedule 06.11.2014    source sumber
comment
Apakah Anda mencoba meningkatkan nilai argumen digits dari kelas POSIXct?   -  person Mr. Mascaro    schedule 06.11.2014
comment
Tidak, bagaimana cara melakukannya?   -  person Mike    schedule 06.11.2014
comment
Ini mungkin bisa membantu.   -  person Mr. Mascaro    schedule 06.11.2014
comment
Itu sedikit tergantung pada db dan driver yang Anda gunakan. Protokol ODBC bisa menjadi sedikit kabur ketika mengonversi tipe (db yang berbeda mempertimbangkan tanggal, waktu, dll.) sehingga RODBC harus menebak-nebak. Coba gunakan argumen as.is untuk menarik kolom itu sebagai karakter dan kemudian mengubahnya sendiri menjadi R.   -  person joran    schedule 06.11.2014
comment
Hai teman-teman, terima kasih atas balasannya. Saya masih berjuang. Bagaimana cara melakukan argumen as.is? Permintaan saya saat ini terlihat seperti ini sqlQuery(myconn,paste0("SELECT Period FROM stats.HourV2OnDisk WHERE Login = ", clientLogins[j,1]))   -  person Mike    schedule 06.11.2014
comment
Argumen itu didokumentasikan dengan cukup jelas. Apa sebenarnya deskripsi dalam dokumentasi cara menggunakannya yang membingungkan Anda?   -  person joran    schedule 06.11.2014


Jawaban (3)


Hal ini mungkin disebabkan oleh ketidakcocokan antara zona waktu lokal mesin Anda (Sys.timezone()) dan zona waktu data yang Anda ambil.

RODBC menggunakan as.POSIXct yang menggunakan zona waktu mesin Anda saat ini secara default. Jika data berisi stempel waktu yang tidak valid atau ambigu dalam zona waktu tersebut, hal aneh mungkin terjadi. Misalnya transisi ke dan dari waktu musim panas dapat menimbulkan masalah.

Ini berfungsi dengan baik karena kedua stempel waktu didefinisikan dengan baik di zona waktu lokal dan UTC:

> as.POSIXct(c("2016-01-01 00:00:01","2016-03-26 02:30:00"))
[1] "2016-01-01 00:00:01 CET" "2016-03-26 02:30:00 CET"
> as.POSIXct(c("2016-01-01 00:00:01","2016-03-26 02:30:00"), tz="UTC")
[1] "2016-01-01 00:00:01 UTC" "2016-03-26 02:30:00 UTC"

Yang pertama secara diam-diam menghilangkan H:M:S pada semua stempel waktu karena stempel waktu terakhir tidak valid dalam zona waktu lokal:

> as.POSIXct(c("2016-01-01 00:00:01","2016-03-27 02:30:00"))
[1] "2016-01-01 CET" "2016-03-27 CET"
> as.POSIXct(c("2016-01-01 00:00:01","2016-03-27 02:30:00"), tz="UTC")
[1] "2016-01-01 00:00:01 UTC" "2016-03-27 02:30:00 UTC"

Salah satu solusinya adalah mengambil data dengan apa adanya, lalu secara manual mengonversi ke POSIXct dengan menentukan zona waktu yang tepat. Dalam hal ini db berisi stempel waktu UTC:

data <- sqlQuery(mssql,
                 "SELECT timestamp, value FROM table",
                 as.is=c(TRUE, FALSE))
data$timestamp <- as.POSIXct(data$timestamp, tz="UTC")
person amhr    schedule 16.06.2016

Saya punya masalah dengan sqlQuery yang melakukan ini juga. Perbaikan yang mudah, jika kumpulan data Anda tidak terlalu besar, adalah opsi "apa adanya". Ini berfungsi baik dengan sqlFetch

sqlFetch(myconn, "table_name", as.is = c(TRUE,TRUE,TRUE,TRUE))
person farmkid    schedule 03.09.2015

Saya memiliki pertanyaan yang sama dan menemukan solusi berikut:

R: hilangnya presisi saat POSIXct mengikat dengan datetime (server sql)

Anda hanya perlu membaca kolom sebagai string:

pilih convert(nvarchar(24), Dt, 21) sebagai Dt, nilai dari mybus

-Mike

person user2371007    schedule 15.04.2015