【问题标题】:In MySQL, How would I go about comparing todays date vs. a date in my database table?在 MySQL 中,我将如何比较今天的日期与数据库表中的日期?
【发布时间】:2011-04-27 17:39:39
【问题描述】:

我正在为孕妇构建一个网络应用程序(用于我的大学网络开发课程)
在我的数据库中,我存储了每个用户的受孕日期。

在我的应用程序中,我将受孕日期与今天进行比较,并为用户提供一些有关其怀孕时间点的信息。

我的数据库中还有一个表,其中还保存了怀孕每个“阶段”的记录(即第 1 阶段 = 1-2 个月,第 2 阶段 = 2-3 个月等)
那么我将如何构建我的 MySQL 查询呢?这就是我一直在尝试的工作......

选择 s.id 作为 stageid , p.id 作为患者 ID , 名 , s.营养信息 , s.commonsymptoms , p. 受孕日期 从阶段 s,患者 p 在哪里 p.id=? AND TO_DAYS(p.conceptiondate)=To_DAYS(NOW());,

上面的最后一行(TO_Days()=TO_DAYS() 部分)是我苦苦挣扎的部分。
在我的“阶段”表中为每个阶段存储一行开始日期和结束日期是否明智?
但是,既然我所有的用户都有不同的受孕日期,那该怎么做呢?

我将在 php 中使用这个查询,然后在我用 ExtJS 构建的界面中使用那个 PHP 查询。

【问题讨论】:

  • 阶段应该可能是 1-3 个月、4-6 个月和 7-9 个月。在人类怀孕世界中,这些通常被称为“妊娠期”。
  • @MJB 我确定 OP 的意思是问“关于 SQL,而不是生物学 LOL”
  • @Johan:是的,我知道。但是编写一个好的应用程序意味着了解你的受众,所以......

标签: php mysql date extjs


【解决方案1】:

您的查询

SELECT s.id as stageid
  , p.id as patientid
  , s.name
  , s.nutritioninfo
  , s.commonsymptoms
  , p.conceptiondate 
FROM stage s, patient p 
WHERE p.id=? and TO_DAYS(p.conceptiondate)=To_DAYS(NOW());,

有几个问题:

  1. 不要使用隐式连接语法(使用 where 连接),它会造成混淆和贬低; 始终使用显式联接!见下文。
  2. 在您的查询中没有一个连接条件,其中来自stage s 的字段连接到来自patient p 的字段,例如(join on p.x = s.y)
  3. 我建议不要在阶段数据库中使用单日。使用范围而不是将字段 stage.stageday 替换为 2 个字段 stage.startdaystage.endday

这是我的建议:

选择 s.id 作为 stageid , p.id 作为患者 ID , 名 , s.营养信息 , s.commonsymptoms , p. 受孕日期 来自患者 p INNER JOIN 阶段 ON (DATEDIFF(CURDATE(), p.conceptiondate) 在 s.startday 和 s.endday 之间) 在哪里 p.id=?

这使用了显式连接cf ANSI 92 语法,它清楚地显示了两个表是如何连接的。
我添加了两个新字段startdayendday,现在您只需在怀孕的每个阶段定义 1 行。您甚至可以有重叠的阶段。
0 = 受孕日,196 应该是出生日。不要忘记包括足够的额外天数以防晚产:-)。

【讨论】:

  • 感谢一百万!在我的 webdev 课程中,我们并没有真正深入了解 MySQL,所以我还没有机会学习隐式和显式连接,但我肯定会深入阅读它们。再次感谢!非常感谢您的帮助。
【解决方案2】:

我不会在临时表中保存实际的“日期”,而是开始和停止 DAYs……例如:第一个月是从第 0 天到第 30 天……第二个月从第 31 天到第 60 天,等等。

然后,您的查询可以查询(伪语法)在哪里

current_date() between Conception + Stage.StartDays 
                   and Conception + Stage.StopDays

在 MySQL 中,它的语法是

date_add( Conception, interval Stage.StartDays day ) as an example.

这样,一个人在 1 月 1 日怀孕将在第 4 个月,而昨天怀孕的人将在第一个月(或零,具体取决于“月份”的分类方式)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    相关资源
    最近更新 更多