【问题标题】:Select data between two dates exclude some days选择两个日期之间的数据,排除某些天
【发布时间】:2015-05-05 07:10:07
【问题描述】:

我需要进行查询以选择两个日期之间的数据,但不包括工作日和其他一些日子,例如公共假期。

SELECT 
`tblproduction`.`OperaterID`, `tblproduction`.`OperationID`, 
SUM(`tblproduction`.`TotalProduced`) AS TotalProduced, 
SUM(`tblproduction`.`TotalProducedOperator`) AS TotalProducedOp,
'Normal working day' AS DayType
FROM `tblproduction` 
WHERE tblproduction.StartDateTime >= '2015-02-01 00:00:00' AND (tblproduction.StartDateTime <= '2015-02-28 23:59:59') AND tblproduction.OperaterID = 10
AND (DAYOFWEEK(tblproduction.StartDateTime) IN (1,7)) AND (DATE(tblproduction.StartDateTime) NOT IN (SELECT HolidayDate FROM tblholidays))
GROUP BY `tblproduction`.`OperaterID`, `tblproduction`.`OperationID`
UNION ALL
SELECT 
`tblproduction`.`OperaterID`, `tblproduction`.`OperationID`, 
SUM(`tblproduction`.`TotalProduced`) AS TotalProduced, 
SUM(`tblproduction`.`TotalProducedOperator`) AS TotalProducedOp,
'Weekend' AS DayType
FROM `tblproduction` 
WHERE tblproduction.StartDateTime >= '2015-02-01 00:00:00' AND (tblproduction.StartDateTime <= '2015-02-28 23:59:59') AND tblproduction.OperaterID = 10
AND (DAYOFWEEK(tblproduction.StartDateTime) NOT IN (1,7)) AND (DATE(tblproduction.StartDateTime) NOT IN (SELECT HolidayDate FROM tblholidays))
GROUP BY `tblproduction`.`OperaterID`, `tblproduction`.`OperationID`

为此,我有一个包含预定义日期的表格,这些日期代表名为 tblHolidays 的公共假期。 sql 查询的标准之一是避免计算假期期间制作的件数。通过运行这个查询,钢铁包括那些是假期的日期。我应该在查询中更改什么?

【问题讨论】:

  • 我会扩展您的公共假期表,以包含所有日期(过去/未来几年),并有一列指示它是哪一天。那么您的查询将是一个简单的连接。

标签: mysql date


【解决方案1】:

也许从这个开始......

SELECT p.OperaterID
     , p.OperationID
     , SUM(p.TotalProduced) TotalProduced
     , SUM(p.TotalProducedOperator) TotalProducedOp
     , CASE WHEN DAYOFWEEK(p.startdatetime) IN (1,7) THEN 'Normal working day' ELSE 'Weekend' END DayType
  FROM tblproduction p
 WHERE p.StartDateTime >= '2015-02-01 00:00:00' AND p.StartDateTime <= '2015-02-28 23:59:59'
   AND p.OperaterID = 10
   AND DATE(p.StartDateTime) NOT IN (SELECT HolidayDate FROM tblholidays)
 GROUP 
    BY p.OperaterID
     , p.OperationID
     , CASE WHEN DAYOFWEEK(p.startdatetime) IN (1,7) THEN 'Normal working day' ELSE 'Weekend' END

【讨论】:

  • 不幸的是它给出了相同的结果。还计算在定义为节假日的日期中产生的数量。
  • 它给出了相同的结果,但查询量减少了一半,所以它仍然是一个更好的起点。
猜你喜欢
  • 2012-10-31
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2014-06-14
相关资源
最近更新 更多