如何在Oracle中转换日期?

时间:2013-11-05 06:43:05

标签: mysql sql oracle oracle11g

我在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时,这是工作

2 个答案:

答案 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')