From 7405b49d82519d8c81f30660081f4da798f1de6d Mon Sep 17 00:00:00 2001 From: schuemie Date: Mon, 17 Jun 2024 11:34:22 +0200 Subject: [PATCH] Communicating dates as strings between Java and R (bad idea, but wanted to save this code) --- R/Sql.R | 16 ++++++++-------- inst/csv/jarChecksum.txt | 2 +- inst/java/DatabaseConnector.jar | Bin 21321 -> 21350 bytes .../databaseConnector/BatchedInsert.java | 10 +++++----- .../ohdsi/databaseConnector/BatchedQuery.java | 14 ++++++++------ tests/testthat/test-insertTable.R | 12 +++++++++++- 6 files changed, 33 insertions(+), 21 deletions(-) diff --git a/R/Sql.R b/R/Sql.R index 7453de77..ad534b72 100644 --- a/R/Sql.R +++ b/R/Sql.R @@ -118,15 +118,15 @@ parseJdbcColumnData <- function(batchedQuery, column <- format(column, "%Y-%m-%d") } } else if (columnTypes[i] == 4) { - column <- rJava::.jcall(batchedQuery, "[D", "getNumeric", as.integer(i)) - column <- as.POSIXct(column, origin = "1970-01-01") - } else { - column <- rJava::.jcall(batchedQuery, "[Ljava/lang/String;", "getString", i) - if (!datesAsString) { - if (columnTypes[i] == 4) { - column <- as.POSIXct(column) - } + column <- rJava::.jcall(batchedQuery, "[Ljava/lang/String;", "getString", as.integer(i)) + if (length(column) == 0) { + timeZone <- "" + } else { + timeZone <- substr(column, 21, 999)[1] } + column <- as.POSIXct(substr(column, 1, 19), format = "%Y-%m-%d %H:%M:%OS", tz = timeZone) + } else { + column <- rJava::.jcall(batchedQuery, "[Ljava/lang/String;", "getString", as.integer(i)) } columns[[i]] <- column } diff --git a/inst/csv/jarChecksum.txt b/inst/csv/jarChecksum.txt index 41222a3b..8d96c42a 100644 --- a/inst/csv/jarChecksum.txt +++ b/inst/csv/jarChecksum.txt @@ -1 +1 @@ -c820514eb79eae56af2614eafe15d2306631218ac8738a286e4e2c878d3156de +ec60fa18e389072c979178a05dbccd921c739adf5e2a94bef5a843017f7d8631 diff --git a/inst/java/DatabaseConnector.jar b/inst/java/DatabaseConnector.jar index 38f5bb51ba7f197c4c4817a309bf17b1e7091c69..85949fd69debca1975550e6196b760689d448c61 100644 GIT binary patch delta 10290 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 T6aANMID|l*88KSvAMt+xPD!>E delta 10280 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