我能够选择记录和所有喜欢下面的查询,但选择语句是选择记录随机创建之后指定的日期。我很好奇是否有办法按这个日期以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 TABLE
和INSERT 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'))会更安全。