需要对varchar2列进行排序

时间:2018-06-21 03:32:58

标签: php sql oracle

我有一个oracle表,其中包含两列,一列用于日期(交易日期),另一列用于时间(交易时间)。我正在从php文件中检索数据,并在HTML表中显示数据。我将两列连接起来,并在报告中将其显示为单列。我的问题是,我需要对该列进行排序,并且需要将最早的列排在最前面。

我该怎么做。我试图通过to_date将date列转换为date,但是没有用。

请帮助我

3 个答案:

答案 0 :(得分:0)

表的结构不好。有称为DATETIMESTAMP的数据类型,可以很容易地对其进行排序。如果您将它们存储为字符串/ 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)数据类型存储值,然后:

  • 可以轻松按时间顺序对值进行排序。
  • 您可以轻松找到范围内的日期。
  • 数据库将有效地存储值-使用7个字节的日期和时间在一起,而不是将其存储为字符串时至少需要8个字符的日期和6个时间的字符串。

如果必须(出于业务原因)将值存储为文本,然后使用ISO-8601格式YYYY-MM-DDHH24: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;