需要对 varchar2 列进行排序
Posted
技术标签:
【中文标题】需要对 varchar2 列进行排序【英文标题】:Need to sort varchar2 column 【发布时间】:2018-11-30 06:44:35 【问题描述】:我有一个包含两列的 oracle 表,一列用于日期(交易日期),另一列用于时间(交易时间)。我正在从 php 文件中检索数据并在 html 表中显示数据。我正在连接两列并将其显示为报告中的单列。我的问题是我需要对该列进行排序,并且需要将最早的列放在首位。
我该怎么做。我尝试通过 to_date 将日期列转换为日期,但没有成功。
请帮帮我
【问题讨论】:
请显示您迄今为止所做的查询。那样帮忙会容易得多。 要求我们协助解决问题而不提供有关您的应用程序的详细信息(表结构、查询等),就像要求机械师修理您的汽车却不让他看到汽车一样。请提供所有相关信息和详细信息。 '我尝试通过 to_date 将日期列转换为日期,但没有成功。'.转换为日期是正确的解决方案,因此问题在于您如何尝试实现它。如果您希望我们帮助您,您需要发布一些示例数据和您已经编写的代码。另外,请解释它是如何不起作用的:抛出异常?不会编译?顺序错误? 【参考方案1】:表的结构不好。有称为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
【讨论】:
【参考方案2】:最好的解决方案是使用DATE
(或TIMESTAMP
)数据类型存储值,然后:
如果您必须(出于业务原因)将值存储为文本,则使用 ISO-8601 格式 YYYY-MM-DD
和 HH24: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 列进行排序的主要内容,如果未能解决你的问题,请参考以下文章
交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致
将时间戳插入 Oracle 数据库中的 Varchar2 列