台灣最大程式設計社群網站
線上人數
1647
 
會員總數:246276
討論主題:189811
歡迎您免費加入會員
討論區列表 >> PHP >> 用日期區間找符合的日期區間
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
用日期區間找符合的日期區間
價值 : 25 QP  點閱數:3826 回應數:10
樓主

單單OWQ
門外漢
0 2
43 7
發送站內信

目前我正在作一個積分系統的網頁,內含查詢積分的功能

有一類的積分是以「積分期間」來計算積分,積分期間顧定為12個月

例如:

A先生在2011.04月發表一篇論文,該論文積分為10分

積分期間為2011.04月~2012.03月

意思代表說 A先生在2011.04月到2012.03月

每月享有該論文10分的積分點數

積分期間可以重複

若A先生在2011.06月又發表一篇論文,該論文積分為10分

積分期間為2011.06月~2012.05月

若使用者在2011.07月使用積分系統查詢的話

將會查到7月分A先生有10+10=20分積分點數


目前我是使用Dreamweaver CS4 + PHP +MySQL 在製作網頁

查詢會用到的網頁為admin.php和search.php

admin.php和search.php皆有兩個資料表worker(員工)和research(研究)

research資料表連結worker資料表

admin.php有姓名+日期的搜尋,點選確認之後會將跳至search.php將結果顯示在search.php上

主要的語法是寫在search.php...

select *
form research JOIN worker USING (name)
where ..... // name LIKE %keyword% 是姓名的查詢語法

但目前就是卡在不知道怎麼加上日期的查詢

有想過要用between但怎麼寫都失敗

請各位大大 先進們幫幫忙 感激不盡...>A<

搜尋相關Tags的文章: [ 日期區間 ] ,
本篇文章發表於2012-04-23 17:35
1樓
回應

Kuo-En Hung
捐贈 VP 給 Kuo-En Hung 檢舉此回應
從你的例子來看,每次積分應該都有日期才對。假設論文 table 是, research, 然後積分欄位是 credit, 有一個時間戳記為 createdate.
則 Research Table 至少會有以下欄位。
credit : 積分
creditdate : 時間
worker_id : 作者 id

然後有個 worker 的 Table
所以 A 先生的兩篇論文資料內容如下
No. credit, creditdate, author
#1 10, 2011/04/01, Mr.A
#2 10, 2011/06/01, Mr.A

七月查詢時,只要


這樣應該就可以了吧? 或是你可以把你的 schema 分享出來會比較快喔!
本篇文章回覆於2012-04-23 20:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

Kuo-En Hung
捐贈 VP 給 Kuo-En Hung 檢舉此回應
更正一下上面的發表,資料內容應該是

No. credit, creditdate, worker_id
#1 10, 2011/04/01, 132
#2 10, 2011/06/01, 132

後來才看到叫 worker .

^_^
本篇文章回覆於2012-04-23 20:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

單單OWQ
檢舉此回應
你好~感謝你的回答...我的問題是where裡面不知道能不能使用如您說的between '2010/07/01' and '2012/07/31'..

因為積分的區間是不固定~是由admin.php的查詢功能查詢後~系統要能自動去判斷該name下面某個時間是否包含於積分期間內

就是假設A先生在2011.04月發表一篇論文,該論文積分為10分

積分期間為2011.04月~2012.03月

若我在admin.php輸入 「A先生 2012.03」 //系統要能抓出2012.03月有A先生的該論文積分10分

可否用 creditdate between range1 and range2 // range1為起始時間 range2為結束時間
本篇文章回覆於2012-04-24 08:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

單單OWQ
檢舉此回應
補充:

如果說我的查詢是由兩個文字欄位分別是查詢姓名以及查詢日期

所以原先才會將where寫成 where name LIKE %keyword% AND range1 LIKE %keyword2%

但這樣似乎不可能讓系統自動去判斷 使用者輸入range1後要能找出該姓名和日期是否有在一段積分期間內

有非常多的人建議我不要用DW寫會比較好

大大是否覺得我也該將admin.php或是search.php重新用PHP不要用DW去寫 = ="

因為我不太會使用PHP 所以想說能從現有的去改就盡量改

若不能的話也只能重寫了...只是剩兩星期要交件怕來不及..
本篇文章回覆於2012-04-24 08:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

單單OWQ
檢舉此回應
抱歉 我真的寫到有點錯亂...

現在有點看懂您的意思

請問您寫的是7.01~7.31

那若全年都會作到積分的加總

是否要從1月寫到12月...>A<
本篇文章回覆於2012-04-24 09:04
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

Pan01
檢舉此回應
換個 腦袋 想想 何種 以 年月日 來表示的 日期區間 等同於 期間為2011.04月~2012.03月.
本篇文章回覆於2012-04-24 09:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

溫子
捐贈 VP 給 溫子 檢舉此回應
Orz
當第二次發言時就因該把範圍擴大為 2011.04月 ~ 2012.05月都為積分10,
所以只要判斷發文當下沒超過 2011.05月 就是積分10...

開始日基本可以無視,因為通常為發文當下~
每發一次文就把結束日期擴大,單純點就沒有這樣多的問題呀!!

between 要判斷時間就必須該 欄位型態為時間型態, 如果設為文字型態的話,
就會有問題發生,除非存的是 UNIX Time ...
本篇文章回覆於2012-04-24 10:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
between就是一種範圍值的應用語法。
轉換成你看的懂的寫法

creditdate between '2010/07/01' and '2012/07/31'
就是等於
creditdate >='2010/07/01' AND creditdate<='2010/07/01'

當然,上面的寫法是假設欄位為日期類型為主。

不過依照你的說法。似乎你的積分因該有相對的起始日期及結束日期。且是依月為單位的情況。
由於不知道你儲存的值為何。我這堸眾]儲存的值為字串模式也就是

A先生在2011.04月發表一篇論文,該論文積分為10分
積分期間為2011.04月~2012.03月
其起始值是201104結束201203

若A先生在2011.06月又發表一篇論文,該論文積分為10分
積分期間為2011.06月~2012.05月
其起始值是201106結束201205

則其SQL的語法我會寫成如下
假設起始值是s_date 結束值是e_date
要查201107的積分總合則是


以上是列出所有員工的值。如果只是單一員工的話。可以改成


以上,由於你未很完整提供你的資料節構。所以有些名稱我用代用的方式讓你了解。

本篇文章回覆於2012-04-24 11:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

Kuo-En Hung
捐贈 VP 給 Kuo-En Hung 檢舉此回應
有點好奇你的積分,莫非每次積分算的時間都是不同的嗎? 比如說 2012/04 的積分 10 分,可以在今年有效,可是 2012/03 的積分可能 20 分,卻是在兩年內都有效?
本篇文章回覆於2012-04-24 23:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

單單OWQ
檢舉此回應
感謝各位的解答~我已經大概有頭緒了^_^ 3Q~
本篇文章回覆於2012-04-27 14:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.