作者 主題: 請教關於時間區間判斷問題  (閱讀 9222 次)

0 會員 與 1 訪客 正在閱讀本文。

Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
請教關於時間區間判斷問題
« 於: 2009-05-26 09:27 »
不好意思又來請教各位學長們了...是這樣子的.小弟有個關於借場地的預約程式裡面有段是關於場地使用時間的判斷.

資料表的欄位如下: (僅列關於時間部份)
year ---    年
month --- 月
day --- 天
starttime --開始小時
startmin -- 開始分鐘
endtime -- 結束小時
endmin  -- 結束分鐘

例如:
98526800分至1230

紅色標記部分為使用者要選填的資料(下拉式表單方式選擇)

因此小弟使用以下程式碼(程式碼說明:變數後面有接數字1的是從資料庫撈出來比對的資料)
代碼: [選擇]
if((($startorder >= $start_1) AND ($end <= $end_1) AND ($year == $year1) AND ($month == $month1) AND ($day == $day1) AND ($roomtype == $roomtype1)) OR (($startorder >= $start_1) AND ($end >= $end_1) AND ($year == $year1) AND ($month == $month1) AND ($day == $day1) AND ($roomtype == $roomtype1)) OR (($startorder <= $start_1) AND ($end <= $end_1) AND ($year == $year1) AND ($month == $month1) AND ($day == $day1) AND ($roomtype == $roomtype1)) OR (($startorder <= $start_1) AND ($end >= $end_1) AND ($year == $year1) AND ($month == $month1) AND ($day == $day1) AND ($roomtype == $roomtype1)))
{
echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
}
但是結果是不管某個時段是無人預借的都會顯示上述的錯誤訊息.....想了很久還是沒什麼頭緒...所以特來請教各位學長指點一下迷津.

謝謝


PS:環境為PHP 5.2.9-1 MYSQL 5.077

slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #1 於: 2009-05-26 09:56 »
我看起來, 資料表欄位跟程式用的變數沒辦法串連.

例如:
代碼: [選擇]
starttime --開始小時
startmin -- 開始分鐘
endtime -- 結束小時
endmin  -- 結束分鐘
在程式內完全沒看到相關變數.

所以可能要麻煩提供這些欄位與變數的對應或轉換關係.
冷笑話: 我的 IP 是 127.0.0.1

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #2 於: 2009-05-26 09:58 »
對於date time booking 比較沒有在做
不過有一個 function 叫 strtotime

Pail

  • 俺是博士!
  • *****
  • 文章數: 1040
  • 性別: 男
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #3 於: 2009-05-26 10:04 »
輸入資料予以"制式化", 如...一律用 2 個數字表示.

時間的比對就可以簡化了....
全部串起來, 用字串去比~~~
98年5月26日 8時00分至12時30分
==> start: 9805260800 
       end: 9805261230
應該會讓比較式好看一些...
Pail Luo.
Email: pail.luo@gmail.com

Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #4 於: 2009-05-26 11:28 »
我看起來, 資料表欄位跟程式用的變數沒辦法串連.

例如:
代碼: [選擇]
starttime --開始小時
startmin -- 開始分鐘
endtime -- 結束小時
endmin  -- 結束分鐘
在程式內完全沒看到相關變數.

所以可能要麻煩提供這些欄位與變數的對應或轉換關係.
上述所提的變數是資料庫欄位的名稱...
而在我的FORM中的變數對應關係如下:

form中的名稱 --->資料庫欄位名稱
year ---> year
month ---> month
day ---> day
startorder -->starttime
startmin --> startmin
endtime --> endtime
endmin -->endmin

而其他看到的變數後面有加上1的是從資料庫撈出資料的變數,對應如下:
startorder ---> start_1
endtime ---> end_1
year  --> year1
month --> month1
day --> day1




Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #5 於: 2009-05-26 11:29 »
對於date time booking 比較沒有在做
不過有一個 function 叫 strtotime
好的~小弟再來去官網翻看看該怎麼做....謝謝

Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #6 於: 2009-05-26 11:41 »
輸入資料予以"制式化", 如...一律用 2 個數字表示.

時間的比對就可以簡化了....
全部串起來, 用字串去比~~~
98年5月26日 8時00分至12時30分
==> start: 9805260800 
       end: 9805261230
應該會讓比較式好看一些...
這部份小弟曾這樣嘗試...程式碼如下:

資料庫撈出來的部份:
$get_data = $year1.$month1.$day1;
$get_time_start = $startorder1.$startmin1;
$get_time_end   = $endtime1.$endmin1;

表單的部分:

$datedata = $year.$month.$day;       
$newtime  = $startorder.$startmin;
$newtime2 = $endtime.$endmin;

比對程式碼如下:
代碼: [選擇]
if(($roomtype1 == $roomtype) && ($get_data == $datedata) && ($get_time_start <= $newtime) && ($get_time_end <= $newtime2) )
{
echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
}
這樣子似乎還是不行~可能是小弟的方式有誤...不知道若是採用這樣的方式的話..該怎麼去設定條件?
若是今天的例子是
9805260800~9805261200

小弟想到幾個以下的區間的時間應該要顯示已有人預訂
9805260700~9805261200
9805260800~9805261100
9805260800~9805261300
9805260700~9805261300

大致上應該會有這四種情況的時間區間吧?!

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #7 於: 2009-05-26 13:09 »
用strtotime 會返回 unix 的 timestamp 直接比數字大小
http://tw.php.net/manual/en/function.strtotime.php

Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #8 於: 2009-05-26 15:54 »
用strtotime 會返回 unix 的 timestamp 直接比數字大小
http://tw.php.net/manual/en/function.strtotime.php
小弟參考學長的方式做出以下的結果
代碼: [選擇]
//資料庫中已存在的開始時間
$years = $year1+1911;
$mix   = $years."-".$month1."-".$day1."-".$start_1.":".$start_2;
$newsort = strtotime($mix);
//資料庫中已存在的結束時間
$years = $year1+1911;
$mix2   = $years."-".$month1."-".$day1."-".$end_1.":".$end_2;
$newsort2 = strtotime($mix2);

代碼: [選擇]
//使用者輸入的開始時間
$beforemix   = $meetingyear."-".$month."-".$day."-".$startorder.":".$startorder2;
$beforesort = strtotime($beforemix);
//使用者輸入的結束時間
$beforemix2   = $meetingyear."-".$month."-".$day."-".$end1.":".$end2;
$beforesort2 = strtotime($beforemix2);
然後比對規則如下:
代碼: [選擇]
if(($beforesort <= $newsort) && (($beforesort2 <= $newsort2) > $newsort))
{
echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
}
   if(($beforesort >= $newsort) && ($beforesort2 <= $newsort2))
   {
   echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
   }
   if((($beforesort >= $newsort) < $newsort2) && ($beforesort2 >= $newsort2))
   {
   echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
   }
   if(($beforesort <= $newsort) && ($beforesort2 >= $newsort2))
{
echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
}
測試的結果幾乎是沒有問題...唯一的問題在於若是今天時間區間為1300~1700(已存在於資料庫中)而使用者輸入的時間為1000~1600
系統一樣讓我送出沒有錯誤提示但是以下的程式碼應該要產生作用不是嗎?(如果我沒理解錯的話)
代碼: [選擇]
if(($beforesort <= $newsort) && (($beforesort2 <= $newsort2) > $newsort))
{
echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
}
當使用者輸入的開始時間小於資料庫中的開始時間且使用者輸入的結束時間小於資料庫中的結束時間大於資料庫中的開始時間就要提示錯誤訊息......還是說小弟的理解是錯的??還請學長指教....謝謝

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #9 於: 2009-05-26 18:27 »
一天 1~24

13~17 被 mark 了

後面的人不管怎麼劃只要 開始 或 結束 任一個 在 13~17 都不能劃要用警告

Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #10 於: 2009-05-26 22:59 »
一天 1~24

13~17 被 mark 了

後面的人不管怎麼劃只要 開始 或 結束 任一個 在 13~17 都不能劃要用警告
不好意思學長小弟有幾個地方看不懂

1.妳說13~17被MARK了是什麼意思??
2.妳說只要開始或結束在13~17之間都不能劃要用警告?這警告又是什麼意思?

謝謝


slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #11 於: 2009-05-26 23:00 »
如果是學校使用, 我會考慮用另一種方式.

1. 將所有的可借用教室編碼
2. 將可以借用的時段, 以半小時或一小時為單位, 進行編碼.
3. 將以上兩者交叉, 產生資料表

代碼: [選擇]
教室代碼  日期  時段  借用人
當使用者選擇時, 只能選指定時段的起訖, 然後程式把這時段轉換成 1 或 0 , 而填寫到資料表內

程式端輸入:
代碼: [選擇]
借用人: 吉他社
日期: 5/26
起始時間: 18:00
結束時間: 19:59 (19:30~19:59)

轉換成:
代碼: [選擇]
教室代碼  日期  時段  借用人
  F001  5/26  1800  吉他社
  F001  5/26  1830  吉他社
  F001  5/26  1900  吉他社
  F001  5/26  1930  吉他社

後續要新增時, 直接判斷資料表內是否已登記, 再回應登記時間.

純屬個人想法, 優缺點則還沒細想 ^^!

特點:
1. 不只可以判斷是否重複, 還可以建議同時段的空教室或同教室的不同時段.
2. 如果有多人同時使用時, 可以先標記"預約", 再"確認"或"取消預約"等過程.
3. 登記的資料量大時, 不需要將全部登記資料全部檢查一次, 只要轉換一次, 檢查資料表即可, 將來資料量大較不會拖慢速度.
« 上次編輯: 2009-05-26 23:16 由 slime »
冷笑話: 我的 IP 是 127.0.0.1

slime

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #12 於: 2009-05-26 23:07 »
一天 1~24

13~17 被 mark 了

後面的人不管怎麼劃只要 開始 或 結束 任一個 在 13~17 都不能劃要用警告
不好意思學長小弟有幾個地方看不懂

1.妳說13~17被MARK了是什麼意思??
2.妳說只要開始或結束在13~17之間都不能劃要用警告?這警告又是什麼意思?

謝謝



先確定"開始" < "結束"
如果"開始" < 13 而且 "結束" < 13 , 那可以借用
如果"開始" > 17 而且 "結束" > 17 , 也可以借用
其他狀況都不能借用(因為有任何一段重疊了)
冷笑話: 我的 IP 是 127.0.0.1

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1692
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #13 於: 2009-05-27 09:31 »
先確定"開始" < "結束"
如果"開始" < 13 而且 "結束" < 13 , 那可以借用
如果"開始" > 17 而且 "結束" > 17 , 也可以借用
其他狀況都不能借用(因為有任何一段重疊了)
YES! 謝謝 slime大 的翻譯!
--
我覺得我得了教授病了!說一些自以為很簡單,但別人完全看不慬的病....orz

Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #14 於: 2009-05-27 16:14 »
一天 1~24

13~17 被 mark 了

後面的人不管怎麼劃只要 開始 或 結束 任一個 在 13~17 都不能劃要用警告
不好意思學長小弟有幾個地方看不懂

1.妳說13~17被MARK了是什麼意思??
2.妳說只要開始或結束在13~17之間都不能劃要用警告?這警告又是什麼意思?

謝謝



先確定"開始" < "結束"
如果"開始" < 13 而且 "結束" < 13 , 那可以借用
如果"開始" > 17 而且 "結束" > 17 , 也可以借用
其他狀況都不能借用(因為有任何一段重疊了)
想了一整晚終於搞清楚了~ :P

改用以下程式碼就可以了
代碼: [選擇]
if(!(($beforesort < $newsort) && ($beforesort2 < $newsort) && ($beforesort > $newsort2) && ($beforesort2 > $newsort2)))
{
echo "<span class=error>很抱歉該地點【" . $rname ."】在【". $year1. "】年【" . $month1. "】月【" . $day1 ."】日的【". $get_time_start ."】到【" . $get_time_end. "】被【" . $rman ."】登記了,返回<a href=javascript:history.back(-1)>上一頁</a></span>";
exit;
}
小弟在回覆的同時突然想到..上述的程式碼似乎就可以取代前面所PO出來的程式碼....等等來測試一下 ;D

Squawell

  • 懷疑的國中生
  • **
  • 文章數: 53
    • 檢視個人資料
回覆: 請教關於時間區間判斷問題
« 回覆 #15 於: 2009-05-27 16:18 »
先確定"開始" < "結束"
如果"開始" < 13 而且 "結束" < 13 , 那可以借用
如果"開始" > 17 而且 "結束" > 17 , 也可以借用
其他狀況都不能借用(因為有任何一段重疊了)
YES! 謝謝 slime大 的翻譯!
--
我覺得我得了教授病了!說一些自以為很簡單,但別人完全看不慬的病....orz
應該是小弟的理解力比較差一點啦 :P