R และ SQL: การนำเข้าวันที่และเวลาจาก SQL ไปยัง R

ฉันกำลังนำเข้าข้อมูลจาก SQL ไปยัง R ข้อมูลมีคอลัมน์ในรูปแบบ DateTime ใน SQL โดยมีวันที่ในรูปแบบต่อไปนี้: 2014-10-01 13:00:05 อย่างไรก็ตาม เมื่อฉันนำเข้าข้อมูลเหล่านี้ไปยัง R โดยใช้แพ็คเกจ RODBC คอลัมน์ใน R จะถูกจัดรูปแบบเป็นประเภทข้อมูล POSIXct และแสดงคอลัมน์ดังต่อไปนี้: 2014-10-01 กล่าวคือ ไม่มีชั่วโมง นาที หรือวินาที

ไม่มีใครรู้วิธีนำเข้าจาก SQL ไปยัง R และรักษาชั่วโมง นาที และวินาทีหรือไม่

โปรดแจ้งให้เราทราบหากฉันต้องเพิ่มสิ่งใดในคำถามเพื่อชี้แจงเพิ่มเติม

ขอบคุณ

ไมค์


person Mike    schedule 06.11.2014    source แหล่งที่มา
comment
คุณลองเพิ่มค่าของอาร์กิวเมนต์ digits ของคลาส POSIXct หรือไม่   -  person Mr. Mascaro    schedule 06.11.2014
comment
ไม่ ฉันจะทำอย่างไร?   -  person Mike    schedule 06.11.2014
comment
สิ่งนี้อาจช่วยได้   -  person Mr. Mascaro    schedule 06.11.2014
comment
ขึ้นอยู่กับ db และ driver ที่คุณใช้อยู่นิดหน่อย โปรโตคอล ODBC อาจคลุมเครือเล็กน้อยเมื่อแปลงประเภท (ฐานข้อมูลที่แตกต่างกันจะพิจารณาวันที่ วันที่-เวลาที่แตกต่างกัน ฯลฯ) ดังนั้น RODBC จึงต้องทำการคาดเดาอย่างมีการศึกษา ลองใช้อาร์กิวเมนต์ as.is เพื่อดึงคอลัมน์นั้นเป็นอักขระ แล้วแปลงด้วยตนเองเป็น R   -  person joran    schedule 06.11.2014
comment
สวัสดีทุกคน ขอบคุณสำหรับคำตอบ ฉันยังคงดิ้นรน ฉันจะทำอาร์กิวเมนต์ as.is ได้อย่างไร ขณะนี้ข้อความค้นหาของฉันมีลักษณะเช่นนี้ sqlQuery(myconn,paste0("SELECT Period FROM stats.HourV2OnDisk WHERE Login = ", clientLogins[j,1]))   -  person Mike    schedule 06.11.2014
comment
ข้อโต้แย้งนั้นได้รับการบันทึกไว้ค่อนข้างชัดเจน อะไรเกี่ยวกับคำอธิบายในเอกสารเกี่ยวกับวิธีการใช้งานที่ทำให้คุณสับสน?   -  person joran    schedule 06.11.2014


คำตอบ (3)


อาจเกิดจากการไม่ตรงกันระหว่างเขตเวลาท้องถิ่นของเครื่องของคุณ (Sys.timezone()) และเขตเวลาของข้อมูลที่คุณกำลังดึงข้อมูล

RODBC ใช้ as.POSIXct ซึ่งใช้เขตเวลาปัจจุบันของเครื่องของคุณตามค่าเริ่มต้น หากข้อมูลมีการประทับเวลาไม่ถูกต้องหรือคลุมเครือในเขตเวลานั้น สิ่งแปลกประหลาดอาจเกิดขึ้นได้ ตัวอย่างเช่น การเปลี่ยนไปใช้หรือเปลี่ยนเวลาออมแสงอาจทำให้เกิดปัญหาได้

สิ่งเหล่านี้ทำงานได้ดีเนื่องจากการประทับเวลาทั้งสองได้รับการกำหนดไว้อย่างดีในเขตเวลาท้องถิ่นและใน 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"

รายการแรกจะลด H:M:S ลงอย่างเงียบๆ บนการประทับเวลาทั้งหมด เนื่องจากการประทับเวลาล่าสุดไม่ถูกต้องในเขตเวลาท้องถิ่น:

> 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"

วิธีแก้ปัญหาหนึ่งคือการดึงข้อมูลด้วย as.is จากนั้นแปลงเป็น POSIXct ด้วยตนเองโดยระบุเขตเวลาที่เหมาะสม ในกรณีนี้ db มีการประทับเวลา 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

ฉันมีปัญหากับ sqlQuery ในการทำเช่นนี้เช่นกัน วิธีแก้ไขง่ายๆ หากชุดข้อมูลของคุณไม่ใหญ่เกินไป คือตัวเลือก "ตามที่เป็น" สิ่งนี้ทำงานได้ดีกับ sqlFetch

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

ฉันมีคำถามเดียวกันและพบวิธีแก้ปัญหาต่อไปนี้:

R: สูญเสียความแม่นยำเมื่อ POSIXct เชื่อมโยงกับ datetime (เซิร์ฟเวอร์ SQL)

คุณเพียงแค่ต้องอ่านคอลัมน์ในรูปแบบสตริง:

เลือกแปลง (nvarchar (24), Dt, 21) เป็น Dt, ค่าจาก mybus

-ไมค์

person user2371007    schedule 15.04.2015