Sql 在查询顶部定义日期

Sql 在查询顶部定义日期,sql,oracle,Sql,Oracle,我的数据中有很多硬编码的日期,而不是进入并手动更改所有日期,我希望能够在代码顶部定义开始日期和结束日期。有点像SAS中的宏,但在Oracle SQL中 我曾尝试在代码顶部使用DEFINE函数,但在实际执行时出现了错误 DEFINE start_Date = '01-SEP-2019'; DEFINE end_date = '30-SEP-2019'; SELECT * FROM TABLE_NAME WHERE LAST_PAID_DATE >= &start_date AN

我的数据中有很多硬编码的日期,而不是进入并手动更改所有日期,我希望能够在代码顶部定义开始日期和结束日期。有点像SAS中的宏,但在Oracle SQL中

我曾尝试在代码顶部使用DEFINE函数,但在实际执行时出现了错误

DEFINE start_Date = '01-SEP-2019';
DEFINE end_date = '30-SEP-2019';

SELECT *
FROM TABLE_NAME
WHERE LAST_PAID_DATE >= &start_date
  AND LAST_PAID_DATE <= &end_date
我希望这些日期只是为了让我的代码能够正常工作,就像我手动输入它们一样。相反,我得到了以下错误:

ORA-00904:SEP:无效标识符 90400000-%s:无效标识符

我定义它的方式是如何将它存储在我引用的表中,但它告诉我这样做时它是无效的


有什么帮助吗?

如果只有一个查询,可以使用CTE公共表表达式:

WITH PARAMS AS (
      SELECT DATE '2019-09-01' as start_date , DATE '2019-09-30' as end_date
      FROM dual
     )
SELECT *
FROM PARAMS CROSS JOIN
     TABLE_NAME
WHERE LAST_PAID_DATE >= PARAMS.start_date AND
      LAST_PAID_DATE <= PARAMS.end_date;

如果只有一个查询,则可以使用CTE公用表表达式:

WITH PARAMS AS (
      SELECT DATE '2019-09-01' as start_date , DATE '2019-09-30' as end_date
      FROM dual
     )
SELECT *
FROM PARAMS CROSS JOIN
     TABLE_NAME
WHERE LAST_PAID_DATE >= PARAMS.start_date AND
      LAST_PAID_DATE <= PARAMS.end_date;

如果您谈论的是sqlpus,那么就把变量名放在周围。此外,还具有安全的更新功能

To_date('&start', 'yyyymmdd')

现在,如果您正在谈论sqlpus,那么当它提示以格式给出日期时,请将变量名放在旁边。此外,还具有安全的更新功能

To_date('&start', 'yyyymmdd')

现在,当它提示以格式给出日期时

可能需要在定义变量或使用变量时使用to_date。您的程序有多个步骤吗?或者它们只是像您的示例中那样的单个查询?需要日期关键字,例如define start_date=date“2019-09-01”。但是,define不是SQL的一部分,仅在某些应用程序中提供。在定义变量或使用变量时,可能需要使用to_date。您的程序有多个步骤吗?或者它们只是像您的示例中那样的单个查询?需要date关键字,例如define start_date=date'2019-09-01',但是,define不是SQL的一部分,只在某些应用程序中提供。我知道沮丧的程序员经常因为手掌撞击头部而患慢性创伤性脑病CTE。但也许你能拼出CTE在这个上下文中代表什么?@Tom。我补充了首字母缩略词的意思,尽管我不确定这是否有多大帮助。我知道沮丧的程序员经常因为手掌撞击头部而患慢性创伤性脑病CTE。但也许你能拼出CTE在这个上下文中代表什么?@Tom。我补充了首字母缩略词的含义,尽管我不确定这是否有多大帮助。