我有一个oracle表,其中包含两列,一列用于日期(交易日期),另一列用于时间(交易时间)。我正在从php文件中检索数据,并在HTML表中显示数据。我将两列连接起来,并在报告中将其显示为单列。我的问题是,我需要对该列进行排序,并且需要将最早的列排在最前面。
我该怎么做。我试图通过to_date将date列转换为date,但是没有用。
请帮助我
答案 0 :(得分:0)
表的结构不好。有称为DATE
和TIMESTAMP
的数据类型,可以很容易地对其进行排序。如果您将它们存储为字符串/ VARCHAR2', you need to write the sorting code yourself. I'd recommend to store it as a
TIMESTAMP`,并在插入过程中转换日期和时间字符串:
CREATE TABLE mytable (t TIMESTAMP);
INSERT INTO mytable (t)
VALUES (to_timestamp('21.06.2818'||'08:12:27.35', 'DD.MM.YYYYHH24:MI:SS.FF'));
INSERT INTO mytable (t)
VALUES (to_timestamp('21.06.2818'||'08:13:30.62', 'DD.MM.YYYYHH24:MI:SS.FF'));
然后订购它是微不足道的:
SELECT * FROM mytable ORDER BY t;
要将TIMESTAMP
转换回字符串,只需使用TO_CHAR
:
SELECT TO_CHAR(t,'YYYY-MM-DD') as transaction_date,
TO_CHAR(t,'HH24:MI:SS') as transaction_time
FROM mytable
ORDER BY t;
TRANSACTION_DATE TRANSACTION_TIME
2818-06-21 08:12:27
2818-06-21 08:13:30
如果您是高级用户,甚至可以将格式代码粘贴到两个虚拟列中:
ALTER TABLE mytable ADD (transaction_date GENERATED ALWAYS AS (
TO_CHAR(t,'YYYY-MM-DD')));
ALTER TABLE mytable ADD (transaction_time GENERATED ALWAYS AS (
TO_CHAR(t,'HH24:MI:SS')));
SELECT * FROM mytable ORDER BY t;
TRANSACTION_DATE TRANSACTION_TIME
2818-06-21 08:12:27
2818-06-21 08:13:30
答案 1 :(得分:0)
最好的解决方案是使用DATE
(或TIMESTAMP
)数据类型存储值,然后:
如果必须(出于业务原因)将值存储为文本,然后使用ISO-8601格式YYYY-MM-DD
和HH24:MI:SS
(前导零)存储它们,然后使用字母数字排序(即字符串的默认设置)也将按时间顺序对它们进行排序。
答案 2 :(得分:0)
我认为排序是一个数字。
示例:
SELECT TO_CHAR(t,'YYYY-MM-DD') as transaction_date,
TO_CHAR(t,'HH24:MI:SS') as transaction_time
FROM mytable
ORDER BY 2 DESC;