oracle sql如何从varchar中分离年份和月份

时间:2019-07-15 12:53:28

标签: sql oracle

我有varchar列名Calc_code,例如,此varchar'100201',前两个字符是Year(2010),第三个和第四个字符是month({{1} }),最后两个字符与日期无关,因此不重要。

我将如何转换为日期,以便可以在where子句中选择以下内容:

02

4 个答案:

答案 0 :(得分:1)

需要考虑前四位数字,然后我们可以使用TO_DATE对其进行如下转换:

select to_date(SUBSTR('100201',1,4),'YYMM') FROM DUAL;

请注意,由于TO_DATE函数中未提供日期,因此输出将是该月的第一天

干杯!

答案 1 :(得分:1)

您需要前四个字符,您可以使用函数substr()来获取它们:

select *
from  table_a 
where substr(Calc_code, 1, 4) >= p_year_from || p_month_from 
 and  substr(Calc_code, 1, 4) <= p_year_to || p_month_to

我假设p_year_fromp_month_fromp_year_top_month_to是字符串(因为您将它们串联在一起),如果有,则在其左侧填充0必要。

答案 2 :(得分:1)

在您的值的前4个字符子串中使用TO_DATE

SELECT TO_DATE( SUBSTR( calc_code, 1, 4 ), 'RRMM' )
FROM   DUAL;

因此,假设您的p_year_from等值为数字,则代码为:

SELECT *
FROM   table_a 
WHERE  TO_DATE( SUBSTR( calc_code, 1, 4 ), 'RRMM' )
       BETWEEN TO_DATE( TO_CHAR( p_year_from, '00' ) || TO_CHAR( p_month_from, '00' ), 'RRMM' )
       AND     TO_DATE( TO_CHAR( p_year_to,   '00' ) || TO_CHAR( p_month_to,   '00' ), 'RRMM' )

答案 3 :(得分:1)

library(data.table)
dt_res = data.table(tib)
dt_res[, kw := {
  v = kw
  v[check == TRUE] = na.omit(kw)
  v[check == FALSE] = NA
  v 
}, by=session_id]

# or
library(dplyr)
dplyr_res = tib %>% group_by(session_id) %>% mutate(kw = {
  v = kw
  v[check == TRUE] = na.omit(kw)
  v[check == FALSE] = NA
  v 
})

# check 'em
identical(dplyr_res$kw, out$kw)
identical(dt_res$kw, out$kw)