Oracle中的SQL sysdate / Trunc函数

时间:2012-11-30 00:32:04

标签: sql oracle

好的,所以我试图在当月之前的一个月内返回所有信息。我在格式和代码方面略有困难。这是我的尝试。 如果需要,我可以提供表格结构

SELECT hd.Holiday_desc,
soh.Site_Name,
FROM   holiday_details hd
WHERE TRUNC(LAST_DAY(SYSDATE), 'MM' - 1) = TRUNC(hdep.Holiday_Departure, 'MM')
       INNER JOIN holiday_departure hdep 
               ON hd.holiday_code = hdep.holiday_code
Inner join site_visited sv on hd.Holiday_Code = sv.Holiday_code
inner join site_of_holiday soh on sv.Site_code = soh.Site_code

2 个答案:

答案 0 :(得分:1)

我会使用ADD_MONTHS()函数和BETWEEN运算符来完成此任务:

SELECT hd.Holiday_desc,
soh.Site_Name,
FROM   holiday_details hd
WHERE hdep.Holiday_Departure BETWEEN trunc(add_months(sysdate,-1),'MM') 
                                 AND last_day(add_months(sysdate,-1)) + .99999
       INNER JOIN holiday_departure hdep 
               ON hd.holiday_code = hdep.holiday_code
Inner join site_visited sv on hd.Holiday_Code = sv.Holiday_code
inner join site_of_holiday soh on sv.Site_code = soh.Site_code;

此外,如果您的列hdep.Holiday_Departure已编入索引,则您希望避免使用TRUNC函数,这样就不会使此列上的任何索引无效。

答案 1 :(得分:1)

我想你想要

SELECT 
  hd.Holiday_desc,
  soh.Site_Name
FROM   holiday_details hd
       INNER JOIN holiday_departure hdep 
               ON hd.holiday_code = hdep.holiday_code
       INNER JOIN site_visited sv 
               ON hd.Holiday_Code = sv.Holiday_code
       INNER JOIN site_of_holiday soh 
               ON sv.Site_code = soh.Site_code
WHERE 
  TRUNC(hdep.Holiday_Departure, 'MM') = ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1)

您需要了解一下语法。 'MM' - 1不起作用,就像在查询中间有一个WHERE子句一样。 :)此外,在FROM之前有许多逗号。