重写了mySQL声明

时间:2016-05-25 15:22:21

标签: mysql formatting

SELECT DATE(STR_TO_DATE(CONCAT(CONCAT(YEAR('$uDate1'), week), ' Monday'), '%X%V %W') + 
    INTERVAL (7 - DAYOFWEEK(STR_TO_DATE(CONCAT(CONCAT(YEAR('$uDate1'), week), ' Monday'), 
    '%X%V %W'))) DAY)
     as week_end_date

这句话的作用是取我给它的日期( $ uDate1 )并给我那个星期的结束日期(星期六)。这很好用,我很高兴,有点。

我想知道是否有一些我错过的东西可以使这更有效率,或者即使我错过了一些捷径。

对我有什么建议吗?

week >= WEEK('$uDate1') AND week <= WEEK('$uDate2')

这是我的WHERE子句。所以基本上如果我用这个......

DATE('$uDate1', INTERVAL 7 - DAYOFWEEK('$uDate1') DAY)

...然后它返回所有记录的同一天。我需要能够持续几周。

我的数据库中有一个名为&#39;周&#39;的列。它只存储一个对应于一年中一周的INT。 (本周例如21)

然后我有两个日期选择器框。输出得到基于每周的周末日期,该日期是BETWEEN并包括所选日期。

5/10/2016&amp; 2016年5月26日输出 2016年5月14日,2016年5月21日,2016年5月28日

导出到CSV文件的内容看起来像这样..

WEEK END, LAST NAME, FIRST NAME, ...
5/10/2016, Smith, John, ...
5/26/2016, Jones, James, ...

它会输出在一周内有几个小时的人,以及周结束日期。

SIDE注意:我非常感谢您的评论和帮助。我不希望任何人对此施加压力!只是好奇如果更好的方式。 :)

2 个答案:

答案 0 :(得分:0)

正如我在评论中提到的,你应该将这种转换从mysql查询转移到php代码。

我认为没有理由在mysql端进行此计算。

http://ideone.com/48zLvF

$week_day = intval(date('w',$uDate1));

if ($week_day<6) {
  $end_of_week = $uDate1+(86400*(6-$week_day));
} else {
  $end_of_week = $uDate1;
}

答案 1 :(得分:0)

我不确定你当前的SQL为何如此复杂。

你说只是为了约会,并给我那周的周末日期(星期六)

目前你是如何做到这一点的: -

  • 你的年度
  • 添加一年中的一周(我假设 - 应该是WEEK('$ uDate1')我认为)
  • 以字符串形式添加当天(例如今天它将是 2016 21 Monday
  • 将该字符串更改回日期时间值的日期
  • 将该日期时间值转换回日期。
  • 然后再拿一年
  • 再次添加一年中的一周
  • 获取结果字符串的星期几。由于您已将星期一连接到该日期,因此星期几将始终为2.
  • 获取一周中产生的一天并从7减去它。由于星期几总是2,这将总是导致5
  • 以字符串形式添加当天(例如今天它将是 2016 21 Monday )。
  • 然后将此值添加到先前计算的日期,采用星期一日期并添加5天。

我的建议是使用: -

DATE_ADD($uDate1, INTERVAL 7 - DAYOFWEEK($uDate1) DAY) 

这简单得多,似乎可以满足您的要求。

修改

查看您的编辑内容,您需要所有星期六的列表全部或部分在两个通过日期之间。

如果是这样的话,我认为以下内容会做到并且希望更高效,因为不需要将日期转换为字符串。请注意,它依赖于您的周表添加到日期,因此只能处理最多几周的日期范围。

SELECT DATE_ADD(DATE_ADD('$uDate1', INTERVAL 7 - DAYOFWEEK('$uDate1') DAY), INTERVAL `week` WEEK) AS aDate
FROM `week`
HAVING aDate  BETWEEN '$uDate1' AND DATE_ADD('$uDate2', INTERVAL 7 - DAYOFWEEK('$uDate2') DAY)
ORDER BY aDate