2015-09-06 38 views
0

我有一個存儲用戶的可用性,存儲在‘開始’和‘結束’列作爲日期字段一個MySQL表。返回行下個月,MYSQL

我有一個表格,其他用戶可通過與各個時期一樣,今天,明天和下週的庫存狀況「進行搜索。我試圖弄清楚如何構建查詢以獲取「下個月」可用的用戶的所有行。

的今天,也許「開始」值和「結束」值可能會爲三個月走,但如果下個月瀑布「開始」和「結束」之間的話,我想該行返回。 我能得到最近的是與下面的查詢,但只返回行,其中「開始」落在下個月內。非常感謝,

sql= "SELECT * FROM mytable WHERE start BETWEEN DATE_SUB(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)),INTERVAL DAY(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)))-1 DAY) AND LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH))"; 

回答

1

正如你下面的當前日期,你可以嘗試這樣的事情感興趣的東西是發生在整月

SELECT * FROM mytable WHERE 
FLOOR(start/100000000)<=FLOOR(NOW()/100000000)+1 AND 
FLOOR( end/100000000)>=FLOOR(NOW()/100000000)+1 

這個查詢利用的事實datetime值被存儲在MySQL內部爲多個像

SELECT now()+0 
--> 20150906130640 

其中數字09指當前月份。 FLOOR(NOW()/100000000)過濾掉(在此情況下:201509)的數量的第一數字。該WHERE條件現在只是測試start日期是否在任何地方下個月月底前end日期至少或下個月的時期後。 (在我的版本中,我故意排除了start需要「在今天之後」的情況,因爲在我眼中看起來較早的一段時間似乎仍然適用於您描述的目的。但是,如果您希望這種情況包括太,你可以簡單地在你WHERE條款的末尾添加一個AND start > now()。)

編輯

當您SQLfiddle被設置了一個date而不是(因爲我是假設)datetime列的日期將以不同的數字表示,像mumeric格式20150907和100簡單的劃分,現在將得到您所期望的月數進行比較(201509):

SELECT * FROM mytable WHERE 
FLOOR(start/100)<=FLOOR(NOW()/100000000)+1 AND 
FLOOR( end/100)>=FLOOR(NOW()/100000000)+1 

通過NOW()返回的數字仍然是一個14位數字,並需由100000000進行劃分。看到你更新的小提琴在這裏:SQLfiddle

我還添加了另一個記錄('查理'),它不符合您的要求。

更新

爲了更好地適應變化的一年情景我更新了我的SqlFiddlewhere子句現在基於12*YEAR(..)+MONTH(..)類型的函數。

+0

非常感謝但是我無法使這項工作。我已經做了這個sqlfiddle,也許你可以解釋爲什麼查詢返回零結果。http://sqlfiddle.com/#!9/811626/3 – JulianJ

+0

我更新了我的答案。提示:如果對結果不確定,請嘗試使用「select start + 0」。這將以數字格式輸出開始日期,然後由我的分部和場地操作進行操作。 – cars10m

+0

它完美地解釋和奇妙地解釋。非常感激。 – JulianJ