【发布时间】:2016-04-04 11:41:02
【问题描述】:
我正在尝试运行以下查询。我从参数传递日期
SELECT to_char(TIMESTAMP, 'HH24') * 1 TIMESTAMP
,sum(TwoG) TwoG
,sum(ThreeG) ThreeG
,sum(FourG) FourG
FROM (
SELECT *
FROM T_CA_Cellsdown
UNION ALL
SELECT *
FROM T_CA_Cellsdown_TFVF
)
WHERE trunc(TIMESTAMP) = trunc(to_date('03-Apr-16', 'dd-Mon-yy'))
AND Type = 'Network'
GROUP BY to_char(TIMESTAMP, 'HH24') * 1
ORDER BY to_char(TIMESTAMP, 'HH24') * 1
查询错误:ORA-01481:无效数字格式模型
以下查询有效。我只是想将sysdate 更改为一个日期字符串,我通过用户在 php 中的输入作为参数传递。为什么它被乘以 1 我不知道,它是一个可以工作并提供所需结果的查询。
SELECT to_char(TIMESTAMP, 'HH24') * 1
,sum(TwoG) TwoG
,sum(ThreeG) ThreeG
,sum(FourG) FourG
FROM (
SELECT *
FROM T_CA_Cellsdown
UNION ALL
SELECT *
FROM T_CA_Cellsdown_TFVF
)
WHERE trunc(TIMESTAMP) = trunc(sysdate-1)
AND Type = 'Network'
GROUP BY to_char(TIMESTAMP, 'HH24') * 1
ORDER BY to_char(TIMESTAMP, 'HH24') * 1
【问题讨论】:
-
您的 NLS_DATE_LANGUAGE (
select * from nls_session_parameters where parameter = 'NLS_DATE_LANGUAGE') 是什么?TIMESTAMP列是什么数据类型?我猜不是日期/时间戳?最后,你为什么要乘以 1(应该不会影响任何东西,但有点奇怪)? -
如果您想将小时数设为数字,您可以
extract(hour from timestamp)。比乘以 1 来隐式转换或使用 to_number 更简单。您的时间戳列是什么数据类型 - 听起来很明显,但它实际上是时间戳、日期还是字符串?您可以通过查询NLS_SESSION_PARAMETERS检查 NLS 设置。当你在那里时检查 NLS_DATE_FORMAT 和 NLS_TIMESTAMP_FORMAT。 (并在问题中添加信息)。 -
如何找到
NLS_DATE_LANGUAGE? TIMESTAMP 为 DATE_TIME -
这通常是个坏主意@Sagi;首先是因为删除了一年中的世纪部分,其次是因为它通常会弄乱索引策略。如果某事是一个日期,那么保持它作为一个日期总是最好的。在 OP 的情况下,它们在
TIMESTAMP或trunc(TIMESTAMP)上有一个索引。在后一种情况下它被处理,在前一种更好的查询将是where timestamp >= trunc(sysdate - 1) and timestamp < trunc(sysdate) -
我在@Bonez 的评论中写道,尽管亚历克斯已经正确回答了它并且没关系。
标签: oracle