2013-04-18 108 views
0

我有一個MySQL問題。我有一個包含三列的表:'salesdate'(包含日期),'salestime'(包含時間)和'剩餘'(包含整數)。該表包含過去和未來的日期。我想從最接近當前日期和時間的「剩餘」中選擇一個值。MySql查詢子集

我已經構建了下面的查詢,但它只能選擇日期和時間值均爲真的值。這可能會產生錯誤的結果,因爲在'salesdate'中可能有昨天日期的行,但所有'salestime'值都大於當前時間 - 所以我當前的查詢將忽略這些...即使它們是最接近的到當前日期/時間。

我當前的查詢:

$result = mysql_query(
"SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME() 
ORDER BY salesdate DESC 
LIMIT 1 "); 

我想我需要做的是對的日期查詢,然後再以某種方式過濾該列表顯示的日期/時間最接近當前時間?但是如何?如果你可以幫忙 - 我已經搜索並找不到一個清晰的,一步一步的方式來做到這一點。非常感謝您的幫助。

回答

1

最接近當前時間?

第一個問題是你的數據設計是錯誤的。如果時間和日期都指向相同的事件,則信息應該由單個日期時間字段表示 - 不是2個單獨的日期時間字段。因此,對這些數據運行的任何查詢都會非常低效。

另外,從您的描述中不清楚銷售日期+時間可能是未來。

所以使用當前的架構:

SELECT remaining 
FROM quantity_time 
ORDER BY ABS(NOW() - timestamp(salesdate,salestime)) DESC 
LIMIT 1 

術語「剩餘」意味着你使用它來確定庫存水平 - 這意味着你的架構是非常錯誤。代表股票和交易的正確方式是通過兩個獨立的實體(表格)。

+0

嗨。謝謝你的分析。時間和日期確實指的是同一個事件。銷售日期+時間包括未來日期(按照我的描述「該表包含過去和未來日期」)。標籤可能有點混亂,因爲這不是股票/交易表。我按上述方式運行查詢,並返回最舊的記錄,但當更改爲ASC時,它返回了今天的最後一個記錄 - 但這是未來的時間。任何方式不包括未來的時間?如果我使用日期時間字段,那麼我將如何做查詢? – Zander

+0

更改日期和時間字段成爲一個時間字段如你所說,使用下面的查詢似乎返回正確的值: $結果= mysql_query( \t「選擇剩餘 \t FROM quantity_time \t WHERE日期時間<= NOW () \t限制1 \t「); – Zander

+0

對不起,關於ASC/DESC的事情 - 這裏遲到了。爲了省略未來的東西,添加一個WHERE TIMESTAMP(saelesdate,salestime) symcbean

0
SELECT remaining FROM (
SELECT remaining, 
(UNIX_TIMESTAMP(salesdate) - UNIX_TIMESTAMP()) AS difference 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime<=CURTIME() 
) subquery 
ORDER BY difference DESC 
LIMIT 1 

我不知道這是否非常高效,但這至少應該起作用。它首先創建一個子查詢,以秒爲單位計算時間差,然後按差異排序。

+0

這看起來好像是在'剩餘'上做一個時間戳 - 這是一個整數值。這是打算? – Zander

+0

@ user2288451它不會更改剩餘的列。它僅使用時間戳進行臨時比較。執行查詢;) – bwoebi

+0

執行,沒有這不起作用。 「剩餘」不是時間值。這是我想要返回的數量......所以我不確定你在哪裏領導這個。 – Zander

0

你最接近當前日期時間的含義是什麼?

把一些範圍,我不知道應該如何準確的是,但是:

SELECT remaining 
FROM quantity_time 
WHERE salesdate<=CURDATE() 
AND salestime BETWEEN date_sub(NOW(), INTERVAL 24 HOUR) AND date_add(NOW(), INTERVAL 24 HOUR) 
ORDER BY salesdate DESC 
LIMIT 1 
+0

最近的日期/時間我的意思是任何行不在將來。我想查找過去的行,但最接近當前的日期/時間。 – Zander