我在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
答案 0 :(得分:2)
函数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')
答案 1 :(得分:0)
由于medDate
是字符串而不是DATETIME,因此您无法在此列上使用YEAR,但您可以使用DATE_FORMAT转换右侧并保持一致,您应该以相同的格式存储值。 / p>
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,那就更好了。
答案 2 :(得分:0)
YEAR()
和 MONTH()
函数对数据类型DATE
,DATETIME
和{{1]的表达式进行操作}}
如果在VARCHAR表达式上使用这些函数,我相信MySQL会执行VARCHAR到DATE(或DATETIME)的隐式转换,期望格式为TIMESTAMP
(或'YYYY-MM-DD'
)
我相信"不正确的日期时间值"错误被抛出。
只需使用一个生成要匹配'YYYY-MM-DD %h:%i:%s'
的VARCHAR值的表达式,并比较VARCHAR值:
'July 2014'