【问题标题】:Convert INT INTO DATE to calculate AGE将 INT INTO DATE 转换为计算 AGE
【发布时间】:2021-03-30 22:44:54
【问题描述】:

我对 PostgreSQL 的查询有疑问。我有一个学校案例,我需要计算一个人在 2005 年 9 月 1 日注册学校时的年龄。在一个文件中,我有他们的出生日期,只有学校注册的年份。

年份注册是 int 类型('2005'),但我需要将其转换为 01-09-2005 (DD-MM-YYYY),即学年开始。我该怎么做?

  • 如果我想计算注册日期和出生日期之间的差异,是否应该将其转换为日期类型?

  • 如果是,我如何转换它以使出生日期成为日期类型并具有“01-09-2005”格式。

我有一个答案,但我不应该这样做:

SELECT AGE('01/09/2005', auditeur.date_nais)
FROM auditeur
JOIN inscription ON auditeur.id_auditeur = inscription.id_auditeur

我想要的是用 annee ('2005') 替换 '01/09/2005',这是一个 int 类型。

【问题讨论】:

  • 为什么不用ISO 8601 format YYYY-MM-DD 而不是这种模棱两可的形式?这可以读作 1 月 9 日或 9 月 1 日。
  • 因为在法国我们的阅读方式不同,日期的格式为 DD-MM-YYYY,甚至在编程时,我们的老师也希望我们这样做..
  • 你的编程老师很固执。整个行业都已对 ISO 8601 进行了标准化。他们应该接受该计划。这种标准化的原因是我们不必处理奇怪的废话,例如法国偏爱特定日期,而与其他国家出于任何原因偏爱 MM-DD-YYYY 的日期发生冲突。

标签: sql postgresql date type-conversion date-math


【解决方案1】:

这就是您从integer 获得所需date 的方式:

(2005 || '-09-01')::date

串联强制将2005 转换为text。使用 ISO 8601 格式 YYYY-MM-DD。然后转换为date 不依赖于当前的datestyle 设置。

SELECT age((i.annee || '-09-01')::date, a.date_nais) AS age_at_registration
FROM   auditeur a
JOIN   inscription i USING (id_auditeur)
WHERE  a.id = 123; -- select person somehow

相关:

【讨论】:

  • 谢谢你成功了!!现在我知道该怎么做了,这对我帮助很大,谢谢?
【解决方案2】:

无需生成字符串然后转换为日期。您有 3 个整数:表格中的 annee 和常量值 09 代表月份和 01 代表天。有了这些,只需使用 make_date 函数,它接受 3 个整数并返回一个日期。

select  age( make_date (annee,09,01), auditeur.date_nais)
from auditeur 
join inscription 
  on auditeur.id_auditeur = inscription.id_auditeur

【讨论】:

  • 谢谢它也有效!我也试过你的查询,它很有效,非常感谢?
猜你喜欢
  • 2020-07-18
  • 2020-07-08
  • 2014-06-05
  • 2020-08-24
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多