我的架构中有一个视图,其中列出了员工信息。
我想从这两个字段计算 RETIRE_DATE:BIRTH_DATE 和 RETIRE_AGE。
使用
RETIRE_DATE
我想查询某个时间段内退休的员工。
运行查询出现错误
ORA-01741: 非法零长度标识符
我认为这是因为我使用
RETIRE_DATE
作为查询中视图的列。我该如何纠正这个问题?
这是我的代码:
$start_period = strtotime("-100 week");
$stop_period = strtotime("+100 week");
$query = StaffEmploymentListView::find()
->SELECT([
'PAYROLL_NO',
'BIRTH_DATE',
'RETIRE_AGE',
"ADD_MONTHS(BIRTH_DATE, RETIRE_AGE * 12) AS RETIRE_DATE"]);
$query->andFilterWhere(['>=',$this->RETIRE_DATE, $start_period])
->andFilterWhere(['<=', $this->RETIRE_DATE, $stop_period])
->all();
以下是有关错误的一些信息:
ORA-01741: 非法零长度标识符
原因:尝试使用两个双引号(“”)作为标识符。标识符的长度必须至少为一个字符。
您的查询在引用元素的方式上存在问题。我使用 oci_connect 和 oci_execute 进行了测试,没有任何问题。
也许您需要将其重写如下,或者对所有元素使用相同的引用。在您的情况下,您用
'
引用一些列,并用 "
引用最后一部分
<?php
$conn = oci_connect("username","password","database");
$query = "SELECT
PAYROLL_NO,
BIRTH_DATE,
RETIRE_AGE,
ADD_MONTHS(BIRTH_DATE, RETIRE_AGE * 12) AS RETIRE_DATE
FROM YOUR_TABLE_OR_VIEW";
$stmt = oci_parse($conn,$query);
oci_execute($stmt);
?>
问题出在你的这部分代码
$query->andFilterWhere(['>=',$this->RETIRE_DATE, $start_period])
->andFilterWhere(['<=', $this->RETIRE_DATE, $stop_period])
->all();
如果你这样说,则会评估
$this->RETIRE_DATE
并使用 RETIRE_DATE
属性的值。因为该属性为空,所以结果条件将类似于 "" >= $start_period
。
您想要的条件可能是这样的
RETIRE_DATE >= $start_period
。要实现此目的,您需要将 RETIRE_DATE
作为字符串传递到 andFilterWhere
,而不是传递 RETIRE_DATE
属性的值。
$query->andFilterWhere(['>=', 'RETIRE_DATE', $start_period])
->andFilterWhere(['<=', 'RETIRE_DATE', $stop_period])
->all();