我有这个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
但问题是这包括星期天,如果昨天是星期天。 我如何跳过星期天,如果是今天星期一的星期六那个星期六?
感谢
答案 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