Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL查询和间隔_Php_Sql_Date_Intervals - Fatal编程技术网

Php MySQL查询和间隔

Php MySQL查询和间隔,php,sql,date,intervals,Php,Sql,Date,Intervals,这是我提出过的最难的问题: 此查询从三个不同的数据库表中获取数据,以检查数据库中是否有人今天有聚会。在拉脱维亚,我们也有命名日。不管怎么说,这个查询工作得很好,也做得很好,但现在我想让它更酷一点 我想让它显示,下周谁将举行一个聚会。你可能已经注意到Facebook每个周末给你发送的电子邮件,上面显示了谁的生日即将到来 但我就是不明白如何至少达到这个间隔 我记得PHP有一些很好的函数,你可以在哪一天开始月份等等,但是这里可能有一些聪明的人,他们愿意帮助我加快速度。我不确定你的查询是否正确,但是中

这是我提出过的最难的问题:

此查询从三个不同的数据库表中获取数据,以检查数据库中是否有人今天有聚会。在拉脱维亚,我们也有命名日。不管怎么说,这个查询工作得很好,也做得很好,但现在我想让它更酷一点

我想让它显示,下周谁将举行一个聚会。你可能已经注意到Facebook每个周末给你发送的电子邮件,上面显示了谁的生日即将到来

但我就是不明白如何至少达到这个间隔


我记得PHP有一些很好的函数,你可以在哪一天开始月份等等,但是这里可能有一些聪明的人,他们愿意帮助我加快速度。

我不确定你的查询是否正确,但是中提到了命令
SYSDATE()
。您可能想尝试以下方法:

... where date = SYSDATE() + 7
(检查语法,我来自Oracle;))

这将得到未来7天的派对

SELECT
  `user`.`id`,
  `user`.`fname`,
  `user`.`lname` ,
  YEAR(`user`.`bday`) AS  `bday_year`,
  `user`.`class_id`,
  (
    SELECT
      `class`.`class_name`
    FROM  `wp_class_classes`  `class`
    WHERE  `user`.`class_id` =  `class`.`id`
  ) AS  `class_name`,
  CASE
    WHEN MONTH(`week`.`Date`) = MONTH(`user`.`bday`) AND
         DAY(`week`.`Date`) = DAY(`user`.`bday`) THEN 1
    ELSE 2
  END AS `event_type`
FROM  `wp_class_users`  `user`
  LEFT JOIN  `wp_class_namedays`  `name` ON  `user`.`fname` =  `name`.`names`
  LEFT JOIN  (
    SELECT CURDATE() + INTERVAL (1 - DAYOFWEEK(CURDATE())) DAY AS `Date`  UNION ALL
    SELECT CURDATE() + INTERVAL (2 - DAYOFWEEK(CURDATE())) DAY  UNION ALL
    SELECT CURDATE() + INTERVAL (3 - DAYOFWEEK(CURDATE())) DAY  UNION ALL
    SELECT CURDATE() + INTERVAL (4 - DAYOFWEEK(CURDATE())) DAY  UNION ALL
    SELECT CURDATE() + INTERVAL (5 - DAYOFWEEK(CURDATE())) DAY  UNION ALL
    SELECT CURDATE() + INTERVAL (6 - DAYOFWEEK(CURDATE())) DAY  UNION ALL
    SELECT CURDATE() + INTERVAL (7 - DAYOFWEEK(CURDATE())) DAY
  ) `week`
    ON CONCAT(MONTH(`week`.`Date`), '.', DAY(`week`.`Date`)) IN (
      CONCAT(MONTH(`user`.`bday`), '.', DAY(`user`.`bday`)),
      `name`.`day`
    )
WHERE `week`.`Date` IS NOT NULL
用户表与name day表联接,然后将结果集与当前星期的日期进行比较。最终的结果集只列出那些生日或姓名发生在一周内的用户

例如,如果您想了解下周的事件,只需将
week.Date
定义中的间隔更改为
8-DAYOFWEEK…
9-DAYOFWEEK…

最后一件事是,您可以使用
内部联接
,而不是选择列表中的相关子查询,如下所示:

SELECT
  `user`.`id`,
  `user`.`fname`,
  `user`.`lname` ,
  YEAR(`user`.`bday`) AS  `bday_year`,
  `user`.`class_id`,
  `class`.`class_name`
FROM  `wp_class_users`  `user`
  INNER JOIN  `wp_class_classes`  `class` ON  `user`.`class_id` =  `class`.`id`
  LEFT JOIN  `wp_class_namedays`  `name` ON  ...  /* the rest of the above script */
CASE
  WHEN MONTH(`week`.`Date`) = MONTH(`user`.`bday`) AND
       DAY(`week`.`Date`) = DAY(`user`.`bday`) THEN 1
  ELSE 0
END +
CASE CONCAT(MONTH(`week`.`Date`), '.', DAY(`week`.`Date`))
  WHEN `name`.`day` THEN 2
  ELSE 0
END AS `event_type`

上面定义的
event\u type
列可以告诉您该事件是否为生日,但它不会让您知道该特定人员的生日和姓名日期

如果您希望有这种区别,您可以更改
事件类型
定义如下:

SELECT
  `user`.`id`,
  `user`.`fname`,
  `user`.`lname` ,
  YEAR(`user`.`bday`) AS  `bday_year`,
  `user`.`class_id`,
  `class`.`class_name`
FROM  `wp_class_users`  `user`
  INNER JOIN  `wp_class_classes`  `class` ON  `user`.`class_id` =  `class`.`id`
  LEFT JOIN  `wp_class_namedays`  `name` ON  ...  /* the rest of the above script */
CASE
  WHEN MONTH(`week`.`Date`) = MONTH(`user`.`bday`) AND
       DAY(`week`.`Date`) = DAY(`user`.`bday`) THEN 1
  ELSE 0
END +
CASE CONCAT(MONTH(`week`.`Date`), '.', DAY(`week`.`Date`))
  WHEN `name`.`day` THEN 2
  ELSE 0
END AS `event_type`
现在,该列的结果将是:

  • 1–生日
  • 2–命名日
  • 3–两者都有

此外,您可以使用
'B'
而不是
1
'N'
而不是
2
(以及
'
而不是
0
)。结果将是
'B'
,或
'N'
,或
'BN'
。不过,不确定是否可以将
+
用于串联。如果没有,请将两个
CASE
s放入
CONCAT()

请将相关代码发布在这里,而不是其他地方,这样做是为了显示代码。我认为,接下来的七天一点也不难,但本周呢?正确的链接应该是。由于等式运算符,此查询(使用正确的函数)将只选择一个日期而不是一周。在函数中,您可以查找一周中的实际日期,从该点开始,您可以执行我在变量中使用的“+7”,该变量的值从“this day”到“next sunday”,类似于今天=周一,星期天是6天(或7天,但你计算它),所以变量是+6,下周包括+13(6+7=13),如果你想“这周”,你可以使用得到当天的指数。然后,您可以在星期五的今天和星期五(7-dayofweek)之间进行WHERE生日,以获得“本周”的生日。但你为什么要提醒用户过去的生日呢?除非他们的实际当事人是较晚的;)当我尝试执行此查询时,我发现一个错误:#1064-您的SQL语法有错误;查看MySQL服务器版本对应的手册,了解使用第16行“DAYS AS
Date
UNION ALL SELECT CURDATE()+INTERVAL(2-DAYOFWEEK)DAYS”的正确语法我真的不知道,这有什么不对,因为我以前从未做过类似的间隔,如果你能帮助我,我将不胜感激。谢谢。@Robert:
DAYOFWEEK
实际上应该是
DAYOFWEEK(CURDATE())
。对不起,是我的错。修复了这个问题。感谢您的努力,但我仍然收到相同的错误:#1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near'DAYS AS
Date
UNION ALL SELECT CURDATE()+INTERVAL(2-DAYOFWEEK(CURDATE)的正确语法16@Robert:在间隔表达式中将
DAYS
更改为
DAY
。再次抱歉。嘿,再次感谢您的努力:)感谢上帝,第16行现在已经很清楚了。但是语法上还有一个错误。#1064-您的SQL语法有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解使用“varchar(2))+”附近的正确语法。+CAST(DAY(
week
Date
)作为varchar(2))in(CAST(MONTH)”在第24行