【问题标题】:Check for expiration by calculating the number of days between given dates MYSQL通过计算给定日期MYSQL之间的天数来检查过期
【发布时间】:2023-04-02 12:51:02
【问题描述】:

在我的项目中,我需要未过期的用户订阅计划。当用户订阅一个计划时,它将被输入到一个表usersubscription中,其结构如下所示:

id  user_id   plan_id  subscribed_on

存储计划详情的表是subscription_plans

id  plan   days_limit  discounted_rate  added_on    status  rate
1   PlanJ  30          240              1403094260  1       245.00

我需要检查用户是否订阅了未过期的计划(包含所选视频)(即,它将在 subscribed_on+days_limit 天过期)。我现在使用的当前查询是

select id from usersubscription where (plan_id 
        IN 
        (
          (
            SELECT DISTINCT plan_id 
            FROM 
            subscribed_videos sv where sv.videoid = 2
          )
        )
       OR id IN 
      (
           SELECT DISTINCT assosiated_plan_id AS plan_id
           FROM subscription_groups sg
           JOIN subscribed_videos sv ON sv.plan_id = sg.plan_id
           WHERE sv.videoid = 2
       )
    ) and user_id=1

这将检查 id 为 1 的用户是否订阅了任何包含 id 为 2 的视频的计划。我将日期保存为整数(unix 时间戳)。

谁能帮我找到解决办法?

提前致谢

【问题讨论】:

  • 你能在 MySql 上构建架构吗fiddle
  • @Shell..请检查sqlfiddle.com/#!2/4f734/1
  • 我不知道它是否有帮助。但是,我试过了。 sqlfiddle.com/#!2/df9619/1/2
  • @Shell..我需要检查所选视频是否有活动计划(即,未过期的计划)。如果满足条件,查询应该返回空行或记录。

标签: php mysql date unix-timestamp


【解决方案1】:
select id from usersubscription us
JOIN subscribed_videos sv ON sv.plan_id = sg.plan_id
where (plan_id 
    IN 
    (
      (
        SELECT DISTINCT plan_id 
        FROM 
        subscribed_videos sv where sv.videoid = 2
      )
    )
   OR id IN 
  (
       SELECT DISTINCT assosiated_plan_id AS plan_id
       FROM subscription_groups sg
       JOIN subscribed_videos sv ON sv.plan_id = sg.plan_id
       WHERE sv.videoid = 2
   )
) and user_id=1
and FROM_UNIXTIME(us.date) < TIMESTAMPADD(day,sv.days_limit,FROM_UNIXTIME(us.date))

【讨论】:

    【解决方案2】:

    这样试试

    select us.id from usersubscription us INNER JOIN subscription_plans sp ON us.plan_id = sp.id
     where (us.plan_id IN 
            (
              (
                SELECT DISTINCT plan_id 
                FROM 
                subscribed_videos sv where sv.videoid = 2
              )
            )
           OR us.id IN 
          (
               SELECT DISTINCT assosiated_plan_id AS plan_id
               FROM subscription_groups sg
               JOIN subscribed_videos sv ON sv.plan_id = sg.plan_id
               WHERE sv.videoid = 2
           )
        )   and us.user_id=1 
            and sp.subscribed_on > UNIX_TIMESTAMP(DATE_ADD(CURDATE(),INTERVAL (sp.days_limit * -1) DAY))
    

    这将返回订阅仍然有效的记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2011-02-11
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多