如何使用dd- mm -yy格式的日期进行排序



我能够选择记录和所有喜欢下面的查询,但选择语句是选择记录随机创建之后指定的日期。我很好奇是否有办法按这个日期以dd- mm -yy的格式下单,比如05-MAY-21.

select * from Employees 
where createDt >= '05-MAY-21'
order by CreateDt asc

这个语句没有给出我所希望的,我希望从日期05、06等的记录开始。

提前谢谢你。

日期格式为dd- mm -yy,如05-05-21

ADATE是二进制数据类型,它执行NOT有任何格式

如果你这样做:

select *
from   Employees 
where  createDt >= DATE '2021-05-05'
order by CreateDt asc

然后它将按升序排序日期:年、月、日、小时、分钟、秒(是的,DATE总是有一个时间分量)。

如果你这样做:

select *
from   Employees 
where  createDt >= '05-MAY-21'
order by CreateDt asc

然后你隐式地要求Oracle将字符串转换为DATE,你的查询实际上是在做:

select *
from   Employees 
where  createDt >= TO_DATE(
'05-MAY-21',
( SELECT value
FROM   NLS_SESSION_PARAMETERS
WHERE parameter = 'NLS_DATE_FORMAT' )
)
order by CreateDt asc

如果NLS_DATE_FORMAT会话参数与您的字符串格式不匹配,那么您将得到意想不到的结果。


如果您想按字母顺序排列日期,而不是按时间顺序排列,那么在ORDER BY子句中将它们转换为字符串:

select *
from   Employees 
where  createDt >= DATE '2021-05-05'
order by TO_CHAR(CreateDt, 'DD-MON-YY') asc

然而,我不确定你为什么要这样做。

WHERE子句似乎不对

你说createDt列的数据类型是DATE。为什么要把它和字符串比较呢?使用日期字面值或TO_DATE函数,不要依赖隐式数据类型转换。

select * from Employees 
where createDt >= date '2021-05-05'  -- No! '05-MAY-21'
order by CreateDt asc

另一方面,如果您只认为该列的数据类型是DATE,但实际上是VARCHAR2,那么您必须"转换";使用TO_DATE函数使用适当的日期格式掩码将其转换为有效的日期值,希望所有该列中的值具有相同的有效格式:

select * from Employees 
where to_date(createDt, 'dd-mmm-yy', 'nls_date_language = english') >= date '2021-05-05'
order by to_date(createDt, 'dd-mmm-yy', 'nls_date_language = english') asc

如果以上都没有帮助,请发布一些示例数据。其中包括CREATE TABLEINSERT INTO几个示例行。

如果你展示你得到的结果和你想要的结果会很有帮助…

无论如何,我试着根据问题和你的评论来猜测。

让我们从"…语句是随机选取记录…"这个声明并没有给出我所希望的,我希望从05、06等日期的记录开始。之后:"以及记录的顺序很奇怪…如日期按08、11、12、24、24、27、27、31等顺序排列">

OK,顺序为"08、11、12、24、24、27、27、31等";这不是随机的,不是吗?这几乎就是你所要求的顺序——升序。我猜所有这些日期都在5月,所以您确实得到了您所要求的:Employees表中createDt大于或等于5月5日的记录,并按升序排序。

但是你说日期顺序对你来说很奇怪,你期待的是05、06、…,得到08 11 12 24

哦!似乎困扰您的是日期之间有一些空白,而且日期不是从5月5日开始的。就是这样吗?那么,简单的答案是:这些日期根本没有出现在Employees表中。

你问别处"…如何将其限制为只发送10条记录?好的,让我猜猜你想要什么。

您希望看到从5月5日开始的10个连续日期以及为每个日期创建的记录。

在这种情况下,你必须"generate"这些日期,然后将它们与Employees表连接,同时考虑到某些日期将没有行-因此使用LEFT join。

with dates as
(select date '2021-05-05' + (level - 1) d from dual connect by level <= 10)
select e.* 
from dates d 
left join employees e 
on e.createDt = d.d
order by d.d

或者,如果createDt包含时间组件

with dates as
(select date '2021-05-05' + (level - 1) d from dual connect by level <= 10)
select e.* 
from dates d 
left join employees e 
on e.createDt >= d.d and e.createDt < d.d + 1
order by d.d, e.createDt

我不确定这是不是它,虽然

还有:你可以使用文字'05-MAY-21',但只有当你绝对确定你的会话使用这个确切的日期格式。使用日期时间字面值或to_date函数(to_date('05-MAY-21', 'DD-MON-YY'))会更安全。

最新更新