sql - 修改查询以使其工作而不需要设置 NLS_DATE_FORMAT
问题描述
我以下查询:
SELECT
trunc(estimatedenddate,'hh') AS reg_date,
COUNT(*)
FROM
(
SELECT
attr_value,
TO_DATE( (DATE '1970-01-01' + (1 / 24 / 60 / 60 / 1000) * attr_value),'yyyy-mm-dd HH24:mi:ss') AS estimatedenddate
FROM
attr
WHERE
attr_name = 'createTimestamp'
)
WHERE
estimatedenddate > TO_DATE('01/JUN/2018','dd/mon/yyyy')
GROUP BY
trunc(estimatedenddate,'hh')
ORDER BY
reg_date DESC;
当我设置NLS_DATE_FORMAT时它可以工作。请参阅dbfiddle。
但是,如果我不设置NLS_DATE_FORMAT,则查询不会产生任何结果。见dbfiddle
如何修改此查询以使其在不设置NLS_DATE_FORMAT的情况下工作?
解决方案
TO_DATE( date_string, format_model )
第一个参数为字符串,但您传递的DATE
数据类型 Oracle 将尝试提供帮助并使用其默认格式模型隐式转换为预期的字符串数据类型;所以你的内部查询是有效的:
SELECT attr_value,
TO_DATE(
TO_CHAR(
DATE '1970-01-01' + (1 / 24 / 60 / 60 / 1000) * attr_value,
(SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT')
),
'yyyy-mm-dd HH24:mi:ss'
) AS estimatedenddate
FROM attr
WHERE attr_name = 'createTimestamp'
相反,您可以删除该TO_DATE()
功能:
SELECT trunc(estimatedenddate,'hh') AS reg_date,
COUNT(*)
FROM (
SELECT DATE '1970-01-01' + (1 / 24 / 60 / 60 / 1000) * attr_value AS estimatedenddate
FROM attr
WHERE attr_name = 'createTimestamp'
)
WHERE estimatedenddate > DATE '2018-06-01'
GROUP BY trunc(estimatedenddate,'hh')
ORDER BY reg_date DESC;
推荐阅读
- python - 为什么 pd.date_range 返回一个空序列?
- angular - 用于由斜线分隔的路径的 Ionic 4 通配符路由
- node.js - 如何在 react-Nodejs Web 应用程序中传递令牌(数据)(从 nodejs 文件到 react tsx 文件)
- c# - 访问被 Azure AD B2C 锁定的 Azure 函数应用时收到 403 错误
- airflow - 当 schedule_interval 设置为 @once 时,只有 dag 中的第一个任务在气流中执行
- html - 有没有办法创建没有网格线的表格?
- python - python:导入对象似乎不一致地破坏现有对象?
- excel - 如何分为 3 个年龄类别
- email - 直接从表单发送电子邮件
- angular - rxjs 错误处理 > 在 catchError 源停止发射