【发布时间】:2021-10-05 19:01:36
【问题描述】:
我正在尝试获取每小时的交易计数。通常这是一个直接的查询,不幸的是,我必须使用的时间戳列不是时间戳,而是 varchar2!无论我尝试什么,我都会得到“无效月份”或“无效数字”,具体取决于我使用的格式。
时间戳看起来像:2021-08-08 00:00:52:632
我还执行了以下操作来获取 NLS 格式:
SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT';
得到
DD-MON-RRRR.
这是我在十几个其他人中尝试的最新版本(我注释掉了“group by”以显示该死的东西)。
select to_char(reqts,'mm/dd/yyyy hh24') DATE_HR
--, count(*)
from idcreqresplog
where logdate > trunc(SYSDATE -2)
and logtypeid in (2,4)
--group by to_char(reqts,'mm/dd/yyyy hh24');
还有
select to_char(reqts, 'yyyy-mm-dd hh24:mi:ss.fff' )
--, count(*)
FROM
reqresplog
WHERE
logdate > trunc(SYSDATE -2) ;
--group by to_date(reqts, 'yyyy-mm-dd HH4');
我束手无策,需要一些帮助。
【问题讨论】:
-
如果您匹配了 some 示例数据,您在该 VARCHAR2 列中,则只有 some 值将被识别为“有效”。其余的(您没有看到的,不知道它们存在的,...)不会,Oracle 将针对这些值引发错误。这就是将日期存储为字符串时发生的情况,因为数据库本身不会阻止用户将日期输入为“LI/TT/LEFO OT”,因此 - 一旦您对其应用 MM/DD/YYYY HH24 格式掩码,您将得到一个错误。因此,永远不要将日期存储为字符串。
-
您是否尝试过使用
TO_TIMESTAMP函数(Oracle Documentation)将您的VARCHAR2转换为时间戳? -
就@Littlefoot 而言,如果您仍然收到错误,您可能需要在 where 子句中添加 REGEXP_LIKE 以确保仅返回有效条目。
-
@Littlefoot 我继承了这个数据库和它的设计,所以我现在必须忍受它。
-
@Del 我已经尝试了在阳光下进行的一切转换,但没有任何工作,很可能是因为 Littlefoor 所说的。有没有办法找到不合格的条目?
标签: sql oracle12c date-format