2017-06-02 86 views
0

我想每週從我存儲日期時間字段的表中獲取記錄。 一個mysql查詢可以識別周的編號爲周的開始結束日期每週日曆記錄

像這裏顯示的鏈接。

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. 
+5

首先,你需要決定:
因此獲得每週的main_table記錄,你可以使用下面的MySQL查詢。它們不是同一件事。那麼你需要發佈足夠的信息,以便其他人不會猜測你想要什麼。表格定義,樣本數據和基於樣本數據的期望輸出。 –

+0

也要注意,美國的週數對於其他地區是不同的,例如 – GuidoG

+0

請給出輸入參數值和預期結果的示例。 – Alexander

回答

0

讓利,存在一些數據的數據庫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'。如果你正在使用MySQL或SQL Server

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' 
+0

看起來不錯@Alexander。讓我試試看會更新你。 – Googler

+0

@Googler,您是否嘗試過解決方案?還有更多的問題嗎? – Alexander

+0

好友尚未。還有一個問題呢。一旦我開始,我會在明天之前不久更新你。現在一點忙。一定會趕上你。需要您的更多幫助。謝謝 – Googler

-2

瞭解如何拿到周here,然後拿到日期之間MySQL的數據,使用以下語句:

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

確保日期格式爲「Ym-d」。

UPDATE:

下面是完整的代碼爲我的作品:

<?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> 
+0

對不起@亞歷山大我不懂你的英文。但是在做這件事之前你有沒有試過這個代碼? – Josiah

+0

在'for'循環中向MySQL服務器發送請求不是個好主意。對不起我的英語不好。 ;) – Alexander

+0

閱讀關於參數化查詢 – Strawberry