另一个SELECT中的SYSDATE FROM DUAL

时间:2014-02-25 12:35:39

标签: sql plsqldeveloper

我的选择时间有问题。数据库中的时间与系统时间不同,所以我想我需要使用SELECT SYSDATE FROM DUAL但它在另一个选择中不起作用。我使用PL / SQL Developer。

SELECT t.something1,
       ROUND((TRUNC(SELECT SYSDATE FROM DUAL) - 1 + 2),1) AS NAME
FROM customers t
WHERE t.something1 = ROUND((TRUNC(SELECT SYSDATE FROM DUAL) - 1 + 2),1);

我也尝试声明新变量,但我总是收到错误消息。

DECLARE
day DATE
SELECT SYSDATE
INTO day
FROM DUAL
SELECT t.something1,
       ROUND((TRUNC(day)- 1 + 2),1) AS NAME
FROM customers t
WHERE t.something1 = ROUND((TRUNC(day) - 1 + 2),1);

3 个答案:

答案 0 :(得分:4)

只有在没有可供选择的表格时,您才必须使用SELECT SYSDATE FROM DUAL获取SYSDATE。这是因为没有SELECT的{​​{1}}对Oracle无效,因此当您想要使用SQL函数而没有表时,必须使用FROM,这是一个特殊的一行一列(名为DUAL)表。唯一的行的值为DUMMY

答案 1 :(得分:1)

ROUND(number)函数仅适用于number数据类型。它不适用于date类型 如果您的t.something1列数据类型是日期而不是您不能使用round()函数(您可以直接将日期与日期进行比较),如果不是并且数字超过您将使用round()并且您需要转换你的sysdate到数字和比较。

根据我的理解,你会做如下的事情:

SELECT t.something1,
   ROUND(to_number(to_char(sysdate+1,'DDMMYYYY')),1) AS NAME
   FROM customers t
   WHERE t.something1 = ROUND(to_number(to_char(sysdate+1,'DDMMYYYY')),1);  

愿这对你有所帮助。

答案 2 :(得分:0)

您不需要子查询:

SELECT t.something1,
       ROUND((TRUNC(SYSDATE) - 1 + 2),1) AS NAME
FROM customers t
WHERE t.something1 = ROUND((TRUNC(SYSDATE) - 1 + 2),1);

这可以解决您的问题吗?