【问题标题】:Cannot convert Oracle String to Date with dbplyr in R无法使用 R 中的 dbplyr 将 Oracle 字符串转换为日期
【发布时间】:2019-06-13 11:40:30
【问题描述】:

连接oracle数据库后,想每天汇总一下数据。我正在使用 tbl() 函数提取数据。连接通过 RJDBC 运行。日期列存储为 char。

日期字符串如下所示(也包含时间): "2015-01-31 10:56:52.0"

我正在尝试将字符串转换为日期格式:

melds <- bibu %>%
  select(DATE) %>%
  mutate(Datday = as.Date(to_date(substr(DATE, 1, 10))))

运行此代码,我希望将字符串 (chr) 转换为日期。发生的情况是,字符串被正确剪切到日期,但时间保持为 0(“2015-01-31 00:00:00.0”)。该列也保留为 char 格式(而不是预期的日期)。

这里创建的sql查询:

melds %>% show_query()
<SQL>
SELECT "DATE", CAST(to_date(SUBSTR("DATE", 1, 10)) AS DATE) AS "Datday"
FROM (TXYZ)

以下问题后更新:

melds <- bibu %>%
  select(DATE) %>%
  mutate(Datday = as.Date(to_date(substr(DATE, 1, 10), "yyyy-MM-dd")), "%Y-%m-%d")

melds %>% show_query()
<SQL>
SELECT "DATE", CAST(to_date(SUBSTR("DATE", 1, 10), 'yyyy-MM-dd') AS DATE) AS "Datday", '%Y-%m-%d' AS """%Y-%m-%d"""
FROM (TXYZ) 

错误:无法检索 JDBC 结果集

【问题讨论】:

  • 你有没有找到答案?我一直在为这个问题苦苦挣扎一段时间。我可以使用 extract() 从 Oracle SQL 中分解 datetime 字段的各个部分,但是我必须将它们变成一个字符,然后再变成一个日期,而且我正在查询的数据太慢了。
  • 不,很遗憾没有。我现在一般都是通过python直接发送sql查询,很少用dplyr....

标签: r database oracle time dbplyr


【解决方案1】:

要将字符串转换为日期,您应该指定格式

to_date(SUBSTR("DATE", 1, 10),'yyyy-mm-dd') 

或随着时间的推移

to_date("DATE",'yyyy-mm-dd hh24:mi:ss') 

示例:

select  to_date(SUBSTR('2015-01-31 10:56:52.00', 1, 10),'yyyy-mm-dd') as dat
,to_date(substr('2015-01-31 10:56:52',1,19),'yyyy-mm-dd hh24:mi:ss') as datTime
,to_timestamp('2015-01-31 10:56:52.0','yyyy-mm-dd hh24:mi:ss.FF1')  as timestmp

from dual;

结果:

数据 |日期时间 | TIMESTMP :-------- | :-------- | :---------------------------- 15 年 1 月 31 日 | 15 年 1 月 31 日 | 15 年 1 月 31 日 10.56.52.000000000

db小提琴here

【讨论】:

  • 我试过了,但日期格式已损坏(“0031-15-01 00:00:00.0”)。此外,coltype 保留了 chr。
  • 我无法重现您的问题,因为如果我执行数据库中的语句,我会得到预期的结果。我添加了示例。
  • 我用日期格式尝试了您的建议。 SQL 代码搞砸了,所以我不认为这是数据库问题,而是 dbplyr 接口问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多