我有varchar列名Calc_code
,例如,此varchar'100201
',前两个字符是Year(2010
),第三个和第四个字符是month({{1} }),最后两个字符与日期无关,因此不重要。
我将如何转换为日期,以便可以在where子句中选择以下内容:
02
答案 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_from
,p_month_from
,p_year_to
和p_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)