使用INSERT ... SELECT与日期格式

时间:2014-08-04 19:12:56

标签: mysql sql database

我在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

3 个答案:

答案 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() 函数对数据类型DATEDATETIME和{{1]的表达式进行操作}}

如果在VARCHAR表达式上使用这些函数,我相信MySQL会执行VARCHAR到DATE(或DATETIME)的隐式转换,期望格式为TIMESTAMP(或'YYYY-MM-DD'

我相信"不正确的日期时间值"错误被抛出。


只需使用一个生成要匹配'YYYY-MM-DD %h:%i:%s'的VARCHAR值的表达式,并比较VARCHAR值:

'July 2014'