MySQL计算两个日期之间的差异,但有点扭曲

MySQL计算两个日期之间的差异,但有点扭曲,mysql,sql,join,datediff,Mysql,Sql,Join,Datediff,我有两个表:产品,用户 Product: Date(Datetime) Phone_Number(Number). User: Date (Datetime) Phone_Number(Number) Type(Value of N or C). 当一个新用户被添加到user表中时,会给它一个日期、电话号码和值“N”(N表示新用户)。 当一个用户被取消时,会给出一个日期、电话号码和“C”值(C表示已取消) 使用MySQL,我需要找出用户创建日期和用户

我有两个表:
产品
用户

Product:
    Date(Datetime)
    Phone_Number(Number).

User: 
    Date (Datetime)
    Phone_Number(Number)
    Type(Value of N or C).
当一个新用户被添加到
user
表中时,会给它一个日期、电话号码和值“N”(N表示新用户)。 当一个用户被取消时,会给出一个日期、电话号码和“C”值(C表示已取消)

使用MySQL,我需要找出用户创建日期和用户取消日期之间的日期差,以及创建日期和取消日期之间是否有产品(可以通过电话号码将用户与产品匹配)

任何帮助都将不胜感激,因为我的查询写作并不糟糕,但我无法解决这个问题


谢谢。

您需要从自加入用户表开始查找创建和取消的日期。然后连接到Product表以查看是否存在任何内容

SELECT
    /* Anything you want from the User table */
    /* CASE statement that checks if prod.phone_number is not null which means a product was present */
FROM
    User user_new
    JOIN User user_can
    ON user_new.phone_number = user_can.phone_number
    LEFT JOIN Product prod
    ON prod.phone_number = user_new.phone_number
WHERE
    (prod.Date IS NULL) OR -- Either there was no record.
    (prod.Date BETWEEN user_new.Date AND user_can.Date) -- or a product existed between the two dates.
SELECT u.Phone_Number, u.Created, u.Cancelled, p.Date as 'ProductDate'
FROM (
    SELECT u1.Phone_Number, u1.Date as 'Created', u2.Date as 'Cancelled'
    FROM User u1
      JOIN User u2 on u1.Phone_Number=u2.Phone_Number
    WHERE u1.Type = 'N'
      and u2.Type = 'C'
  ) u
  LEFT JOIN Product p on u.Phone_Number = p.Phone_Number
                     and p.Date between u.Created and u.Cancelled

如果您只存储一个日期字段,那么您的表似乎没有必要的数据来确定用户创建日期和取消日期之间的差异。但如果有两列,user.createdDate和user.cancelledDate,则可以使用 选择DATEDIFF(user.createdDate,user.cancelledDate)作为DiffDate 我不知道DATEDIFF是否适用于datetime对象,我将其用于格式类似“year-mm-dd”的普通日期,它将为您提供一个带有DiffDate的查询结果对象,DiffDate是天数的整数。
如果user.cancelledDate在user.createdDate之前,您将得到一个负整数。

我曾尝试使用与产品表的左联接,将用户表作为主表,但这使我感到困惑,查询无法运行。请重新考虑您的db设计。产品没有电话号码或日期。为用户、产品和订单创建表格,并通过id进行标识,这将更易于维护,imhoHi Vikdor,谢谢。我会在早上给你一个机会,让你知道进展如何。非常感谢你的帮助。谢谢你的回复,而且解释似乎很好。我试试这个。