我在MySQL中有SQL查询:
SELECT
distinct
us.user_id as user_id,
us.ab_id,
users.name,
users.role,
users.is_admin,
DATE_FORMAT('2013-11-05T10:06:21+04:00', '%Y-%m') as month_m
FROM attach_offices as us
LEFT JOIN users ON users.id = user_id
WHERE us.`ab_id` = 999999999 and
DATE_FORMAT('2013-11-05T10:06:21+04:00', '%Y-%m') between DATE_FORMAT(dt_begin, '%Y-%m') and DATE_FORMAT(`dt_end`, '%Y-%m')
如何将其转换为Oracle 11g?我写的是这样的:
SELECT
distinct
attach_offices.user_id as user_id,
attach_offices.ab_id,
users.name,
users.role,
users.is_admin,
to_date('2013-11-05T10:06:21+04:00', 'YYYY-MM') as month_m
FROM attach_offices
LEFT JOIN users ON users.id = user_id
WHERE attach_offices.ab_id = 999999999 and
to_date('2013-11-05T10:06:21+04:00', 'YYYY-MM') between to_date(to_char(dt_begin, 'YYYY-MM'), 'YYYY-MM') and to_date(to_char(dt_end, 'YYYY-MM'), 'YYYY-MM')
但它不起作用。
日期中的问题,当我使用2013-11-05T10:06:21+04:00
时,它不起作用,但当我使用2013-11
时,这是工作
答案 0 :(得分:1)
由于TO_DATE
会按格式将STRING
转换为DATE
,因此您已指定。
但是,DATE_FORMAT
按照指定格式化DATE。
所以你有以下选择:
1.如果您希望将DATE
作为一些特制的STRING
,那么您可以选择TO_CHAR(DATE, '<format>')
2.如果您想将给定的STRING
转换为DATE
,请使用TO_DATE(string,'<format that describes string>')
3.如果您需要一个特殊的STRING
重新格式化作为另一个STRING
,那么您同时执行这两个操作。首先将其转换为日期,如 2 中所述,然后转换回字符串,如 1 中所述,并带有所需格式。
4.还有一个案例 - 如果你想改变输出格式,那么你需要ALTER SESSION变量NLS_DATE_FORMAT。
答案 1 :(得分:-1)
我做的是这样的事情,但似乎没有DRY和代码味道:
SELECT
distinct
attach_offices.user_id as user_id,
attach_offices.ab_id,
users.name,
users.role,
users.is_admin,
to_date(to_char(to_date('2013-11-05T10:06:21+04:00', 'YYYY-MM-DD"T"HH24:MI:SS"+04:00"'), 'YYYY-MM'),'YYYY-MM') as month_m
FROM attach_offices
LEFT JOIN users ON users.id = user_id
WHERE attach_offices.ab_id = 999999999 and
to_date(to_char(to_date('2013-11-05T10:06:21+04:00', 'YYYY-MM-DD"T"HH24:MI:SS"+04:00"'), 'YYYY-MM'),'YYYY-MM') between to_date(to_char(dt_begin, 'YYYY-MM'), 'YYYY-MM') and to_date(to_char(dt_end, 'YYYY-MM'), 'YYYY-MM')