[英]Using INSERT … SELECT with Date format
我在MySQL中使用INSERT ... SELECT查詢。 現在,在我的數據庫中有一個名為“ medDate”的列,用於我的葯品清單應用程序。 它的類型為Varchar,格式為“ 2014年7月”。 現在,我想使用insert ... select查詢來復制上個月的記錄。 但是,當我測試對MySQL的查詢時,出現一個錯誤,提示日期時間值不正確。 你能幫我嗎? 這是我的查詢。
INSERT INTO medicinesinventory (itemName, compCode, classID,
medDate, price, beginningIn, newIn,
outMed, sales) SELECT DISTINCT(itemName),
compCode, classID, CURDATE(),
price, 0.0, 0, 0.0, 0.0
FROM medicinesinventory
WHERE YEAR(medDate) = DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%M %Y')
AND MONTH(medDate) = DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%M %Y');
樣本數據
compCode medID classID medDate itemname price beginningIn newIn outMed sales
GOLDEN 148 20 July 2014 sample 0.00 0 0.00 0.00 6.00
函數year()
和month()
需要日期。 您可以使用str_to_date()
獲得日期,因為MySQL支持“部分”日期(即沒有日期的日期)。因此,請嘗試以下操作:
WHERE YEAR(str_to_date(meddate, '%M %Y')) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND
MONTH(str_to_date(meddate, '%M %Y')) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
另外,您似乎想以相同的格式設置上個月的格式並進行比較。 這也可以工作:
WHERE medDate = DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%M %Y')
由於medDate
是字符串而不是DATETIME,因此您不能在此列上使用YEAR,但是您可以將DATE_FORMAT轉換為右側,並且為了保持一致,應該以相同的格式存儲值。
INSERT INTO medicinesinventory (itemName, compCode, classID,
medDate, price, beginningIn, newIn,
outMed, sales) SELECT DISTINCT(itemName),
compCode, classID,
DATE_FORMAT(CURDATE(), '%M %Y'), -- formatted this date
price, 0.0, 0, 0.0, 0.0
FROM medicinesinventory
-- and converted those in the where clause
WHERE medDate = DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%M %Y')
注意
如果可以將medDate列的數據類型更改為DATE,那會更好。
YEAR()
和MONTH()
函數對數據類型DATE
, DATETIME
和TIMESTAMP
表達式進行操作。
如果將這些函數用於VARCHAR表達式,我相信MySQL將執行VARCHAR到DATE(或DATETIME)的隱式轉換,期望格式為'YYYY-MM-DD'
(或'YYYY-MM-DD %h:%i:%s'
)
我認為這是引發“日期時間值錯誤”錯誤的地方。
只需使用生成要與'July 2014'
匹配的VARCHAR值的表達式,然后比較VARCHAR值:
WHERE medDate = DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%M %Y')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.