0

我有一个query.sql看起来像这样的文件:

define start_date = '2020-02-01 00:00:00'
define end_date = '2020-02-20 00:00:00'

select * from customers where created_time between '&start_date' and '&end_date';

当我在 SQL Plus 中执行它时,我得到了一个输入值的提示start_dateand end_date

SQL> @query
Enter value for start_date: 
Enter value for end_date: 

为什么?我以为我在脚本中定义了它们?


编辑:created_timeTIMESTAMP 类型。我尝试将查询更改为:

define start_date = timestamp'2020-02-01 00:00:00'
define end_date = timestamp'2020-02-20 00:00:00'

select * from customers where created_time between &start_date and &end_date;

但是遇到了一个不同的错误:

SQL> @query
old   1: select * from customers where created_time between &start_date and &end_date
new   1: select * from customers where created_time between timestamp'2020-02-01 and timestamp'2020-02-20
select * from customers where created_time between timestamp'2020-02-01 and timestamp'2020-02-20
                                                                                *
ERROR at line 1:
ORA-01850: hour must be between 0 and 23
4

2 回答 2

1

首先,修复文字的格式:

SQL> define start_date = date'2020-02-01'
SQL> define end_date = date'2020-02-20'

然后摆脱在初始化期间已经放置的多余引号

SQL> select * from customers where created_time between &start_date and &end_date;

我想created_time是日期类型的,不是吗?

如果数据类型是注释中提到的时间戳,则将date关键字替换timestamp为变量定义

SQL> define start_date = timestamp'2020-02-01 00:00:00'
SQL> define end_date = timestamp'2020-02-20 00:00:00'
于 2020-02-21T15:17:45.473 回答
0

关于时间戳的第二个问题;你正在做的

define start_date = timestamp'2020-02-01 00:00:00'
define end_date = timestamp'2020-02-20 00:00:00'

select * from customers where created_time between &start_date and &end_date;

但请注意替换后的显示方式:

old   1: select * from customers where created_time between &start_date and &end_date
new   1: select * from customers where created_time between timestamp'2020-02-01 and timestamp'2020-02-20

因为您设置的值中有一个空格,所以您需要用双引号将其括起来:

define start_date = "timestamp '2020-02-01 00:00:00'"
define end_date = "timestamp '2020-02-20 00:00:00'"

select * from customers where created_time between &start_date and &end_date;

现在替换为:

old   1: select * from customers where created_time between &start_date and &end_date
new   1: select * from customers where created_time between timestamp '2020-02-01 00:00:00' and timestamp '2020-02-20 00:00:00'

文档实际上说要用单引号括起来,但是由于您的值具有您需要转义它们的值:

define start_date = 'timestamp ''2020-02-01 00:00:00'''
define end_date = 'timestamp ''2020-02-20 00:00:00'''

这也有效,但在这种情况下,双引号更容易一些。


顺便说一句,between它是包容性的,因此您的查询(当它有效时)将选择恰好为 2020-02-20 00:00:00 的任何行,我想这不是您的意图。你可以做:

select * from customers
where created_time >= &start_date
and created_time < &end_date;

如果您打算拥有 2020 年 2 月 20 日起的所有行,则需要将结束日期增加一天才能提取这些行。


但是,这些都不能解释您最初被提示输入变量的问题......如果在时间戳情况解决后仍然发生这种情况,那么它来自脚本的稍后部分 - 或者来自另一个脚本,这个脚本可能会调用。

于 2020-02-21T16:19:28.257 回答