我有一个包含两个日期列的表: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
答案 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;