在ORACLE查询中跳过星期日发生的事件

时间:2014-09-15 08:46:21

标签: sql oracle

我有这个SQL:

SELECT SUM(CURRENT_SURFACE) AS TOTALYESTERDAYPAINTING 
FROM PAINTING_HIST 
WHERE TO_CHAR (PAINT_ENTRY_DATE,'MM/DD/YYYY') = TO_CHAR(SYSDATE - 1, 'MM/DD/YYYY') 
AND PROJECT_NAME = :projName

但问题是这包括星期天,如果昨天是星期天。 我如何跳过星期天,如果是今天星期一的星期六那个星期六?

感谢

2 个答案:

答案 0 :(得分:2)

将日期作为字符串进行比较通常不是一个好主意;它可以防止使用索引。今天使用trunc(sysdate)会给你午夜,所以如果你的paint_entry_date总是设置为午夜,那么你可以这样做:

SELECT SUM(CURRENT_SURFACE) AS TOTALYESTERDAYPAINTING 
FROM PAINTING_HIST 
WHERE PAINT_ENTRY_DATE = TRUNC(SYSDATE) -
  CASE WHEN TO_CHAR(SYSDATE - 1, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'SUN'
    THEN 2 ELSE 1 END
AND PROJECT_NAME = :projName

case语句正在查看今天的日期名称(如果运行此会话的会话使用其他语言,则强制使用英语),并决定是否从中减去一天或两天。< / p>

如果您的专栏中有不同的时间,那么您需要将其作为范围:

SELECT SUM(CURRENT_SURFACE) AS TOTALYESTERDAYPAINTING 
FROM PAINTING_HIST 
WHERE PAINT_ENTRY_DATE >= TRUNC(SYSDATE) -
  CASE WHEN TO_CHAR(SYSDATE - 1, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'SUN'
    THEN 2 ELSE 1 END
AND PAINT_ENTRY_DATE < TRUNC(SYSDATE) -
  CASE WHEN TO_CHAR(SYSDATE - 1, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'SUN'
    THEN 1 ELSE 0 END
AND PROJECT_NAME = :projName

更一般地说,绑定变量days是您想要回顾的天数:

SELECT SUM(CURRENT_SURFACE) AS TOTALYESTERDAYPAINTING 
FROM PAINTING_HIST 
WHERE PAINT_ENTRY_DATE >= TRUNC(SYSDATE) -
  CASE WHEN TO_CHAR(SYSDATE - :days, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'SUN'
    THEN :days + 1 ELSE :days END
AND PAINT_ENTRY_DATE < TRUNC(SYSDATE) -
  CASE WHEN TO_CHAR(SYSDATE - :days, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') = 'SUN'
    THEN :days ELSE :days - 1 END
AND PROJECT_NAME = :projName;

现在如果sysdate - :days是一个星期日,它会回顾额外的一天。

如果您想获取过去七天的数据,但跳过星期日您可以使用的日期:

SELECT TRUNC(PAINT_ENTRY_DATE),
  SUM(CURRENT_SURFACE) AS TOTALYESTERDAYPAINTING 
FROM PAINTING_HIST 
WHERE PAINT_ENTRY_DATE >= TRUNC(SYSDATE) - 7
AND PAINT_ENTRY_DATE < TRUNC(SYSDATE)
AND TO_CHAR(PAINT_ENTRY_DATE, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') != 'SUN'
AND PROJECT_NAME = :projName
GROUP BY TRUNC(PAINT_ENTRY_DATE)
ORDER BY TRUNC(PAINT_ENTRY_DATE);

这将找到截至昨天的七天的所有记录;因此,如果今天运行它将获得2014-09-06到2014-09-14,但是因为那是星期天,所以将排除第14。如果你明天运行它将会在2014-09-07到2014-09-15之间运行,但仍然排除第14位。

答案 1 :(得分:1)

如果你想排除星期日,试试这个:

SELECT SUM(CURRENT_SURFACE) AS TOTALYESTERDAYPAINTING 
  FROM PAINTING_HIST 
 WHERE PAINT_ENTRY_DATE = SYSDATE - 1
   AND TO_CHAR(SYSDATE - 1, 'DAY') != 'SUNDAY'
   AND PROJECT_NAME = :projName