SQL / MYSQL查询未执行

时间:2014-12-11 20:20:18

标签: mysql sql

我有这个sql / mysql查询要执行但是我收到错误。我想也许你可以发现它/他们。我有一张充满数据的表格(附图片。enter image description here

我的疑问是:

select Food, tbl_Date
from finance.fin
where if (day(now()) > 10,
    (select Food, tbl_Date
    where tbl_Date between concat(year(now()), "-", month(now()), "-", 10)  and curdate()),
    (select Food, tbl_Date
    where tbl_Date BETWEEN concat(year(now()), "-", month(now())-1, "-", 10)
AND CURDATE()));

我想检查今天是否是> 10然后如果为真 - >选择食物和tbl_Date行在本月10日和当天的日期之间;否则我想从food和tbl_Date中选择行,其中日期是在过去的第10个月和当天之间。

我收到此错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where tbl_Date between concat(year(now()), "-", month(now()), "-", 10) and curd' at line 2

2 个答案:

答案 0 :(得分:2)

我不会判断您的日期算术,只是为了解决查询问题。在查询中使用时,if()是一个函数,主要用于selectwhereon子句。它不是控制流程。你想要的逻辑更像是:

select Food, tbl_Date
from finance.fin
where (day(now()) > 10 and
       tbl_Date between concat(year(now()), "-", month(now()), "-", 10)  and curdate()
      ) or
      (day(now()) <= 10) and
       tbl_Date BETWEEN concat(year(now()), "-", month(now())-1, "-", 10) and curdate()
     )

答案 1 :(得分:1)

我想你想要这样的东西:

SELECT f.Food
     , f.tbl_Date
  FROM finance.fin f
 WHERE f.tbl_Date >= DATE_FORMAT(NOW(),'%Y-%m-10') 
                     + INTERVAL IF(DAY(NOW())>10,0,-1) MONTH
   AND f.tbl_Date <= CURDATE()

语法错误是一个缺少的FROM子句,你有一个带有WHERE的SELECT。但即使你解决了这个问题,还有另一个问题,在给定的上下文中,子查询可以返回单个标量,一个表达式和一行。

你也遇到了日期算术的问题,从月份的整数值中减去1是1月份的一个问题...这个月你会得到零,你真正想要的是什么是从年份中减去1并将月份设置为12.使用MySQL的内置日期算法代替,并减去一个月的间隔。

您可以更深入地推动该条件检查,并返回0或-1。这是查询中唯一需要更改的部分。 上面的查询为您提供了如下结果:

本月11日,例如&#39; 2014-12-11&#39;,查询将等同于:

SELECT f.Food
     , f.tbl_Date
  FROM finance.fin f
 WHERE f.tbl_Date >= '2014-12-10' + INTERVAL 0 MONTH
   AND f.tbl_Date <= '2014-12-11'

本月9日,例如&#39; 2014年12月9日&#39;查询将等同于

SELECT f.Food
     , f.tbl_Date
  FROM finance.fin f
 WHERE f.tbl_Date >= '2014-12-10' + INTERVAL -1 MONTH
   AND f.tbl_Date <= '2014-12-09'

(这假定tbl_Date列的数据类型为DATE,您希望进行&#34;日期&#34;比较。)

对于DATE,DATETIME和TIMESTAMP比较,我通常使用这样的模式:

  WHERE t.dt >= lower_bound
    AND t.dt <  upper_bound

upper_bound是我 想要包含的最低日期时间值;在这种情况下,第二天的午夜。这种模式&#34;工作&#34;对于dt列的任何精确度,是否只是一个日期,或者它是否在一天中的所有时间到达23:59:59 (or up to the more precise 23:59:59.997`,在SQL Server的情况下。)当分辨率仅为当天时,我遵循相同的约定,因为相同的模式有效。

所以,我实际上倾向于这样写:

 WHERE f.tbl_Date >= DATE_FORMAT(NOW(),'%Y-%m-10') 
                     + INTERVAL IF(DAY(NOW())>10,0,-1) MONTH
   AND f.tbl_Date <  DATE(NOW()) + INTERVAL 1 DAY

请注意,这比第二天午夜的比较(没有相等)。如果tbl_Date的数据类型为DATETIMETIMESTAMP,而不是DATE,那么我们该如何编写它。