需要对 varchar2 列进行排序

Posted

技术标签:

【中文标题】需要对 varchar2 列进行排序【英文标题】:Need to sort varchar2 column 【发布时间】:2018-11-30 06:44:35 【问题描述】:

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

我该怎么做。我尝试通过 to_date 将日期列转换为日期,但没有成功。

请帮帮我

【问题讨论】:

请显示您迄今为止所做的查询。那样帮忙会容易得多。 要求我们协助解决问题而不提供有关您的应用程序的详细信息(表结构、查询等),就像要求机械师修理您的汽车却不让他看到汽车一样。请提供所有相关信息和详细信息。 '我尝试通过 to_date 将日期列转换为日期,但没有成功。'.转换为日期是正确的解决方案,因此问题在于您如何尝试实现它。如果您希望我们帮助您,您需要发布一些示例数据和您已经编写的代码。另外,请解释它是如何不起作用的:抛出异常?不会编译?顺序错误? 【参考方案1】:

表的结构不好。有称为DATETIMESTAMP 的数据类型可以轻松排序。如果您将它们存储为字符串 /VARCHAR2', you need to write the sorting code yourself. I'd recommend to store it as aTIMESTAMP` 并在插入期间转换您的日期和时间字符串:

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

【讨论】:

【参考方案2】:

最好的解决方案是使用DATE(或TIMESTAMP)数据类型存储值,然后:

这些值可以很容易地按时间顺序排序。 您可以轻松找到范围内的日期。 数据库将有效地存储这些值 - 将 7 个字节一起用于日期和时间,而不是在将日期和时间存储为字符串时要求至少 8 个字符和 6 个时间。

如果您必须(出于业务原因)将值存储为文本,则使用 ISO-8601 格式 YYYY-MM-DDHH24:MI:SS(带前导零)和字母数字排序(这是字符串的默认值)存储它们) 也会按时间顺序对它们进行排序。

【讨论】:

【参考方案3】:

我认为排序是一个数字。

例子:

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;

【讨论】:

以上是关于需要对 varchar2 列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中怎么对varchar类型排序问题

ORACLE中创建如何创建表,并设置结构和默认值

交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致

将时间戳插入 Oracle 数据库中的 Varchar2 列

Oracle SQL 在包含数据时将列类型从数字更改为 varchar2

char和varchar在mysql中的效率怎样