【问题标题】:Weekly calendar records周历记录
【发布时间】:2017-06-02 13:53:35
【问题描述】:

我想从存储了日期时间字段的表中每周获取记录。 一个 mysql 查询,可以识别 week numberweek startend date

如链接中所示。

https://www.epochconverter.com/weeks/2017

如何通过 mysql 查询获取该记录,其中包含周数、该周的开始和结束日期以及该周开始和结束日期之间的记录。不适用于当前或单周。我需要它们在过去几周内记录数据库表中可用的日期时间值.. 即

Week (number to know?) - Start date - end date.

Week 01 -   Start date - January 2, 2017 ---- End date --   January 8, 2017
|-> All records in it.
Week 02 -   Start date - January 9, 2017 ---- End date --   January 15, 2017
|-> All records in it.

【问题讨论】:

  • 首先你需要确定你使用的是mysql还是sql server。它们不是同一件事。然后你需要发布足够的信息,这样其他人就不会猜到你想要什么。表定义、样本数据和基于样本数据的期望输出。
  • 还要注意,美国的周数与其他地区的周数不同,例如欧洲
  • 请举例说明输入参数值和预期结果。
  • 您想获取一周的第一天和最后一天的日期,由年份和周数指定吗?
  • 或者你的意思是你的数据库中有一个带有时间戳记录的表,你想获取每条记录的周数、第一个和最后一个日期?

标签: php mysql datetime calendar


【解决方案1】:

让,你的数据库中有main_table 有一些数据。例如:

CREATE TABLE `main_table` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Date` date NOT NULL,
  `Description` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT main_table 
    (`Date`, Description) 
VALUES 
    ('2017-01-02','The first record'),
    ('2017-01-05','The second record'),
    ('2017-01-11','The third record'),
    ('2017-01-17','The fourth record');

创建一个用户定义的函数,它返回与指定日期相同的一周中特定日期的日期。使用CREATE FUNCTION 语法:

DELIMITER $$
CREATE FUNCTION `GET_DAY_OF_WEEK` (`date`  DATE, `day` TINYINT UNSIGNED) 
RETURNS DATE
BEGIN
    RETURN `date`- INTERVAL WEEKDAY(`date`) + 1 DAY + INTERVAL `day` DAY;
END$$
DELIMITER ;

如果您的一周从星期一开始,则使用 1 代表星期一,7 代表星期日。如果您的一周从星期日开始,则使用 0 代表星期日和 6 代表星期六。例如,我的一周从星期一开始,我想得到上星期三的日期,那么

SELECT GET_DAY_OF_WEEK('2017-06-03', 3);

返回'2017-05-31'
因此,要每周获取main_table 的记录,您可以使用以下 MySQL 查询:

SELECT 
    ID, 
    WEEKOFYEAR(`Date`) AS WeekNum,
    GET_DAY_OF_WEEK(`Date`, 1) AS WeekStarted,
    GET_DAY_OF_WEEK(`Date`, 7) AS WeekFinished,
    Description
FROM main_table;

查询结果会是

ID  WeekNum WeekStarted WeekFinished    Description
1   1       2017-01-02  2017-01-08      'The first record'
2   1       2017-01-02  2017-01-08      'The second record'
3   2       2017-01-09  2017-01-15      'The third record'
4   3       2017-01-16  2017-01-22      'The fourth record'

【讨论】:

  • 看起来很棒@Alexander。让我试试看会更新你。
  • @Googler,您尝试过解决方案吗?还有其他问题吗?
  • 好友还没有。还有一个问题。一旦我开始,我会在明天尽快更新你。现在有点忙。一定会赶上你。需要您提供更多帮助。谢谢
  • 如何根据上述记录对日期名称进行编号。就像我希望所有属于星期一的记录为 1,星期二为 2,星期三为 3 等等。我有一个字段日期时间用作过滤记录的基础。
  • @Googler,使用DAYOFWEEK() 方法或DAYNAME()
【解决方案2】:

了解如何获取周here,然后获取日期之间的mysql数据,使用以下语句:

$sql = "SELECT * FROM stock WHERE dateColumnName BETWEEN '{$startDate}' AND '{$endDate}'"; 

确保日期格式为“Y-m-d”。

更新:

以下是适用于我的完整代码:

<?php 
function getStartAndEndDate($week, $year) {
  $dto = new DateTime();
  $dto->setISODate($year, $week);
  $ret['week_start'] = $dto->format('Y-m-d');
  $dto->modify('+6 days');
  $ret['week_end'] = $dto->format('Y-m-d');
  return $ret;
} ?>
    <table>
        <tr>
            <th>Week Number</th>
            <th>From Date</th>
            <th>To Date</th>
        </tr>
<?php 
for($i=1; $i<=52; $i++){
    $week_array = getStartAndEndDate($i,2017);
    $sql = "SELECT * FROM stock WHERE on_date BETWEEN '{$week_array['week_start']}' AND '{$week_array['week_end']}'";
    $result = mysqli_query($con,$sql);
    $item = mysqli_fetch_assoc($result);
    echo "<tr>
            <td>Week $i </td>
            <td>".$week_array['week_start']."</td>
            <td>".$week_array['week_end']."</td>
            <td>".$item['id']."</td>
        </tr>"; 
} ?>

</table>

【讨论】:

  • 对不起@Alexander 我不懂你的英语。但是在这样做之前你有没有试过代码?
  • for 循环中向 MySQL 服务器发送请求不是一个好主意。对不起我的英语不好。 ;)
  • 了解参数化查询
  • 我认为这是最糟糕的,因为循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多