我試圖從一組資料中獲取過去 6 個月的結果,但是當我運行查詢時,它什么也沒顯示。我正在研究的問題是:
Q.使用子查詢,如果運輸已經在從今天算起的過去 6 個月內分配(在此處使用分配的開始日期),則列印名稱、成本和運輸的最大距離(今天在這里表示查詢的日期)運行。不能硬編碼日期)
這是我的查詢:
SELECT TransportCost, TransportName, TransportMaxDist
FROM Service
WHERE FromDate IN
(SELECT FromDate
FROM Service
WHERE MONTH(FromDate) = 6);
當我運行此查詢時,它顯示了正確的列名,但這些列中沒有資料:
--------------- --------------- ------------------
| TransportCost | TransportName | TransportMaxDist |
--------------- --------------- ------------------
| | | |
--------------- --------------- ------------------
以下是CREATE TABLE示例資料語法:
CREATE TABLE Allocation (
TruckVINNum CHAR (4),
TransportID CHAR (2),
FromDate CHAR (16),
ToDate CHAR (16),
TruckAllocation CHAR (8),
PRIMARY KEY (TruckVINNum, TransportID)
);
INSERT INTO Allocation VALUES
('VO23','T1','2020-12-05','2020-12-08','3 Days'),
('VO24','T2','2020-12-03','2020-12-07','4 Days'),
('VO25','T3','2020-12-07','2020-12-13','6 Days'),
('VO26','T4','2021-09-01','2021-09-10','9 Days'),
('VO27','T5','2021-07-16','2021-07-21','5 Days');
CREATE TABLE Service(
TransportID CHAR(2) PRIMARY KEY,
TransportName VARCHAR(11),
TransportCost DECIMAL(6,2),
TransportMaxDist DECIMAL(6,2),
FromDate CHAR(16)
);
INSERT INTO Service VALUES
('T1','Removalist',5000.50, 1000.56,'2020-12-05'),
('T2','Carpenter',1500.00, 550.18, '2020-12-03'),
('T3','Electrician',1750.50, 988.00,'2020-12-07'),
('T4','Scaffolder',2400.70, 340.76,'2021-09-10'),
('T5','Plumber',2100.00, 668.90,'2021-07-16');
uj5u.com熱心網友回復:
首先,您需要知道您的查詢在做什么,尤其是子查詢。讓我們在這里檢查您的查詢:
SELECT TransportCost, TransportName, TransportMaxDist
FROM Service
WHERE FromDate IN
/*the query inside the parentheses is called as subquery*/
(SELECT FromDate
FROM Service
WHERE MONTH(FromDate) = 6);
當您單獨運行該子查詢時,WHERE MONTH(FromDate) = 6這意味著您只需要FromDate列中月份值為6or 的資料June;不分年日。這并沒有真正滿足“......從今天開始計算的過去6個月內......”的條件。
對于“6 個月內”條件,您需要使用 MySQL 日期操作函式,如 DATE INTERVAL和CURDATE() 或 CURRENT_DATE()函式。因此,這樣的查詢:
SELECT TransportCost, TransportName, TransportMaxDist, FromDate
FROM Service
WHERE FromDate >= DATE_SUB(CURDATE(),INTERVAL 6 MONTH);
如您所見,該操作DATE_SUB(CURDATE(),INTERVAL 6 MONTH)采用的CURDATE()是今天,使用 6 個月的時間間隔減去它DATE_SUB()。這也可以寫成:
SELECT TransportCost, TransportName, TransportMaxDist, FromDate
FROM Service
WHERE FromDate >= (CURDATE() - INTERVAL 6 MONTH);
我想當你運行SELECT CURDATE() AS 'Today', DATE_SUB(CURDATE(),INTERVAL 6 MONTH) AS '6 Months Ago from Today'.
@KenWhite 在評論中提到的一個特定細節是關于FromDate(在兩個表中)和ToDate列資料型別。在您的示例中,哪個CHAR不是DATE. 可能的問題是在使用日期操作函式時您可能會得到不正確/不一致的結果。有一種方法可以將該資料轉換為可識別的日期格式,但它會使查詢時間過長。因此,如果假設要存盤日期,則DATE對列使用正確的資料型別。
這是一個演示小提琴。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329534.html
