在oracle中随时间重复AM或PM值

时间:2015-11-12 05:16:05

标签: sql oracle date-formatting

我有一个包含两个日期列的表:time_from,time_to.Both的数据类型为date.Now,我想连接这些列值,这样我只能得到这样的时间:

晚上9:00-9:50。

现在,我的一些时间是在AM,而其他人是PM,我想写一个select语句来连接它们。我写了这个,但它并没有每次都返回“AM”或“PM”。

我的查询是:

select 
  to_char(time_from,'HH:MI:SS PM') || ' - ' || to_char(time_to,'HH:MI:SS PM')
from
  table-name

我最初以12小时的格式插入了我的时间。

请在这里需要一些指导吗?我不想硬编码AM或PM

2 个答案:

答案 0 :(得分:4)

  

现在,我的一些时间是在AM,而其他人是PM

DATE 不会以您看到的方式存储在数据库中。你看到的只是显示的目的,我们才能解释它。 Oracle以 7字节的内部格式存储日期,这是它的专有格式。

  

但每次都没有返回“AM”或“PM”

您需要验证数据,因为 TO_CHAR 不会操纵数据。它会以所需格式显示日期时间

它仅取决于表格中的 DATE 值,并且与 TO_CHAR 中的格式模型 AM/PM无关。

-- setting nls_date_format only for the DATE value display

SQL> alter session set nls_date_format='MM/DD/YYYY HH:MI:SS PM';

Session altered.

PM格式:

SQL> WITH DATA AS
  2    ( SELECT SYSDATE - 4/24 from_date, SYSDATE + 4/24 to_date FROM dual
  3    )
  4  SELECT from_date,
  5    to_date,
  6    TO_CHAR(from_date, 'HH:MI PM')
  7    ||' - '
  8    ||TO_CHAR(to_date, 'HH:MI PM') my_tm_format
  9  FROM DATA;

FROM_DATE              TO_DATE                MY_TM_FORMAT
---------------------- ---------------------- -------------------
11/12/2015 07:39:05 AM 11/12/2015 03:39:05 PM 07:39 AM - 03:39 PM

AM格式:

SQL> WITH DATA AS
  2    ( SELECT SYSDATE - 4/24 from_date, SYSDATE + 4/24 to_date FROM dual
  3    )
  4  SELECT from_date,
  5    to_date,
  6    TO_CHAR(from_date, 'HH:MI AM')
  7    ||' - '
  8    ||TO_CHAR(to_date, 'HH:MI AM') my_tm_format
  9  FROM DATA;

FROM_DATE              TO_DATE                MY_TM_FORMAT
---------------------- ---------------------- -------------------
11/12/2015 07:39:14 AM 11/12/2015 03:39:14 PM 07:39 AM - 03:39 PM

注意

WITH子句仅用于为演示创建示例数据。对您的表使用以下查询,该查询与您当前使用的查询相同。关键是您需要验证数据,因为 TO_CHAR 不会操纵数据。

SELECT from_date,
  to_date,
  TO_CHAR(from_date, 'HH:MI PM')
  ||' - '
  ||TO_CHAR(to_date, 'HH:MI PM') my_tm_format
FROM your_table;
无论您为时间元素指定的格式模型如何,

TO_CHAR 都能够以 12小时格式转换时间元素。

答案 1 :(得分:0)

根据所需的输出(小时没有前导零),它应该是这个:

SELECT 
  TO_CHAR(time_from, 'fmHH:')||TO_CHAR(time_from, 'MI PM') || ' - ' ||
  TO_CHAR(to_from, 'fmHH:')||TO_CHAR(to_from, 'MI PM')
FROM table_name;

SELECT 
  REGEXP_REPLACE(TO_CHAR(time_from, 'HH:MI PM'), '^0') || ' - ' ||
  REGEXP_REPLACE(TO_CHAR(to_from,'HH:MI PM'), '^0')
FROM table_name;