MySQL CAST 3整数为DATE。错误或无法识别日期

时间:2013-07-05 06:46:48

标签: mysql

这是MySQL表的一部分

 Amount | DebitAccount | RecordYear | RecordMonth | RecordDay

在MySQL查询中,需要RecordYear,RecordMonth,RecordDay更改为DATE

基于许多建议获得这样的工作代码(我将代码仅显示为以查看其工作原理)

SELECT * FROM 
(SELECT * 

, CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate 


FROM 2_1_journal) DATA 
WHERE RecordDate <> ? AND DocumentDate = ?
ORDER BY RecordDate DESC

此代码从表中选择所有内容,将分隔的整数更改/转换为RecordDate,并根据WHERE为我提供数据。

以下是第二个工作代码也仅作为示例

SELECT a.AccountNumber, 
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount 
FROM 18_7_ChartOfAccounts AS a 
LEFT JOIN ( 
SELECT DebitAccount, 
SUM( Amount ) AS Amount FROM 2_1_journal WHERE 

CAST(RecordDay AS UNSIGNED) != ? AND CAST(RecordMonth AS UNSIGNED) != ? AND CAST(RecordYear AS UNSIGNED) != ? 

GROUP BY DebitAccount 
) d ON (a.AccountNumber = d.DebitAccount) 

需要第二个代码的CAST(RecordDay AS UNSIGNED) != ? AND CAST(RecordMonth AS UNSIGNED) != ? AND CAST(RecordYear AS UNSIGNED) != ?部分

更改为第一个代码的, CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate部分。

我创建了这样的代码

SELECT a.AccountNumber, 
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount 
FROM 18_7_ChartOfAccounts AS a 
LEFT JOIN (
SELECT DebitAccount, 
SUM( Amount ) AS Amount , 

CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate 

FROM 2_1_journal 
WHERE RecordDate = ? 
GROUP BY DebitAccount 
) d ON (a.AccountNumber = d.DebitAccount) 


/*below code is for purpose to show whole code*/
LEFT JOIN ( SELECT CreditAccount, SUM( Amount ) AS Amount , CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate FROM 2_1_journal WHERE RecordDate = ? GROUP BY CreditAccount ) c ON (a.AccountNumber = c.CreditAccount)

在输出中获取此错误SQLSTATE[42S22]: Column not found: 1054 Unknown column 'RecordDate' in 'where clause'

理解CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate必须位于其他地方。但是什么地方?可能需要像第一个示例中那样添加DATA

代码可能看起来不易理解,但这样的代码可以获得必要的代码。 请指教。

更新

基于建议更改代码

SELECT
a.AccountNumber, 
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount

FROM 18_7_ChartOfAccounts AS a

LEFT JOIN (
SELECT * FROM (
SELECT DebitAccount, 
SUM( Amount ) AS Amount , 

CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate,
CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate 

FROM 2_1_journal) DATA

WHERE RecordDate = 2013-01-20

GROUP BY DebitAccount 

) d ON (a.AccountNumber = d.DebitAccount)

我知道表中的行是日期2013-01-20。但是在输出结果为0且没有错误。

可能是我在代码中的疏忽错误....

得出结论,代码只在MySQL表的第一行检查日期。如果第一行日期与用户输入匹配,则代码会对列Amount中的所有值求和。如果不匹配,则结果为0.

更新1

似乎最终这是有效的代码。目前的输出是预期的。如果可能,请提出改进​​建议

SELECT
a.AccountNumber, 
IFNULL( d.Amount, 0 ) - IFNULL( c.Amount, 0 ) AS Amount

FROM 18_7_ChartOfAccounts AS a

LEFT JOIN (
SELECT DebitAccount, 
SUM( Amount ) AS Amount FROM
( SELECT *  , CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate FROM 2_1_journal) DATA
WHERE

RecordDate = ?

GROUP BY DebitAccount 

) d ON (a.AccountNumber = d.DebitAccount)

LEFT JOIN (
SELECT CreditAccount, 
SUM( Amount ) AS Amount FROM
( SELECT * , CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate FROM 2_1_journal) DATA
WHERE

RecordDate = ?

GROUP BY CreditAccount 

) c ON (a.AccountNumber = c.CreditAccount)

1 个答案:

答案 0 :(得分:3)

您不能只使用CAST,还缺少第一个示例中的SELECT嵌套。没有它,您无法在WHERE;

中使用计算字段
SELECT DebitAccount, 
SUM( Amount ) AS Amount , 
CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate , 
CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate 
FROM 2_1_journal 
WHERE RecordDate = ? 
GROUP BY DebitAccount 

......需要......

SELECT * FROM (
  SELECT DebitAccount, 
  SUM( Amount ) AS Amount , 
  CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate,
  CAST(CONCAT_WS('-', DocumentYear,DocumentMonth,DocumentDay) AS DATE) DocumentDate 
  FROM 2_1_journal) DATA
WHERE RecordDate = ?
GROUP BY DebitAccount 

也就是说,此查询的性能不易维护,您在计算字段上执行WHERE,这必然需要计算表中所有行的值< / em>每次执行查询。在表格中有一个实际的DATE字段可以加快速度。