各位大大
不好意思我在寫網頁要顯示打卡記錄
目前遇到一個邏輯上的問題我兜不太起來
假設我搜尋一個區間 2024/1/1~2024/1/10 有3筆打卡資料
我希望沒有搜尋到的日期也要顯示出來但是不顯示資料
我是用PHP寫的 從MSSQL資料裡面撈出來的
想要顯示的樣子如圖
迴圈我會寫出左邊的但我不太會變成右邊的...
再麻煩大大給個簡單的範例我可以參考修改就可以了...
補充 我是用laravel框架寫的
先搜尋後,在從頁面上利用foreach迴圈撈出來顯示
附上醜醜的程式碼
我有嘗試用for加個日期區間在利用一些if方式判斷但怎麼測試都失敗
不曉得是不是我方向完全錯誤了...
view部分
@foreach ( $Punch_records as $Punch_record )
<tr align="center" valign="middle" height="25px">
<td>
{{ $Punch_record->eventDate }}
</td>
<td>
{{ $Punch_record->first_eventTime }}
</td>
<td>
{{ $Punch_record->min_eventTime }}
</td>
<td>
{{ $Punch_record->max_eventTime }}
</td>
<td>
{{ $Punch_record->last_eventTime }}
</td>
</tr>
@endforeach
@endif
controller部分
$this->Punch_records = DB::connection('sqlsrv_HR')
->table('Punch_record')
->select('eventDate',
DB::raw("MIN(eventTime) AS first_eventTime"),
DB::raw("MIN(CASE WHEN eventTime BETWEEN '12:00:00' AND '14:00:00' THEN eventTime END) AS min_eventTime"),
DB::raw("MAX(CASE WHEN eventTime BETWEEN '12:00:00' AND '14:00:00' THEN eventTime END) AS max_eventTime"),
DB::raw("MAX(eventTime) AS last_eventTime"))
->where('personName', $searchEmployee)
->whereBetween('eventDate', [$searchDate1, $searchDate2])
->groupBy('eventDate')
->get();
CREATE TABLE XX (
X1 NVARCHAR(50),
X2 NVARCHAR(50));
INSERT INTO XX (X1,X2) VALUES
('2024-01-01','08:55'),
('2024-01-05','08:45'),
('2024-01-09','08:57');
WITH CTE_GetDate AS (
SELECT CONVERT(DATE, '20240101') AS NewDate
UNION ALL
SELECT DATEADD(DAY, 1, NewDate)
FROM CTE_GetDate
WHERE DATEADD(DAY, 1, NewDate) < DATEADD(MONTH, 1,CONVERT(DATE, '20240101'))
)
SELECT NewDate,ISNULL(X2,'') AS NewTime
FROM CTE_GetDate
LEFT JOIN XX ON CONVERT(DATE, XX.X1) = NewDate
太感謝了,這樣我有方向了
我一直卡在死胡同,SQL真的是我的弱項,導致我能避免用SQL就不用SQL
但我其他方面也沒有比較會 QQ
SQL Server 2022 新玩具,玩一下
SELECT NewDate,ISNULL(X2,'') AS NewTime
FROM (
SELECT CONVERT(DATE, DATEADD(day, value, '2024-01-01')) AS NewDate
FROM GENERATE_SERIES(0, DATEDIFF(day, '2024-01-01',
DATEADD(day,-1,DATEADD(MONTH, 1,CONVERT(DATE, '2024-01-01')))))
) AS MONTHTABLE
LEFT JOIN XX ON CONVERT(DATE, XX.X1) = NewDate
就2個table一個是日期 一個是你打卡的table
left join不就能達成你要的嗎?
其實也不見得要只利用SQL的方法把資料查出來,可以新增一個array把資料塞進去:
//建立一段連續日期的array,初始化陣列資料
$period = new DatePeriod(new DateTime("2024/1/1"), new DateInterval("P1D"), new DateTime("2024/1/11"));
foreach ($period as $date) {
$data[$date->format("Y/n/j")] = "";
}
//迭代一次察遜出的資料,塞進剛剛建立的array裡
foreach ($Punch_records as $Punch_record) {
$data[$Punch_record["eventDate"]] = $Punch_record["eventTime"];
}