当前位置: 首页 > 面试题库 >

找出两个日期之间的月数

西门飞翮
2023-03-14
问题内容
select 
  (age('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)),
  (age('2012-12-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)),
  (age('2013-01-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)),
  (age('2013-02-28 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp))

它给出以下内容:

  0 years 0 mons 30 days 0 hours 0 mins 0.00 secs
  0 years 2 mons 0 days 0 hours 0 mins 0.00 secs
  0 years 3 mons 0 days 0 hours 0 mins 0.00 secs
  0 years 3 mons 28 days 0 hours 0 mins 0.00 secs

但是我想获得下个月的定义,该怎么办?

  0 years 1 mons 0 days 0 hours 0 mins 0.00 secs
  0 years 2 mons 0 days 0 hours 0 mins 0.00 secs
  0 years 3 mons 0 days 0 hours 0 mins 0.00 secs
  0 years 4 mons 0 days 0 hours 0 mins 0.00 secs

问题答案:

表达方式

age('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)

30 days。我们期望1 month这两个值都指向每月的最后几天。如果将1天添加到值中,我们将获得下个月的第一天,

age('2012-12-01 00:00:00'::timestamp, '2012-11-01 00:00:00'::timestamp)

会给我们1个月的预期时间。因此,让我们检查是否有一个月的最后两天,在这种情况下,我们要返回第二天的年龄间隔。在其他情况下,我们将返回原始值的年龄间隔:

create or replace function age_m (t1 timestamp, t2 timestamp)
returns interval language plpgsql immutable
as $$
declare
    _t1 timestamp = t1+ interval '1 day';
    _t2 timestamp = t2+ interval '1 day';
begin
    if extract(day from _t1) = 1 and extract(day from _t2) = 1 then
        return age(_t1, _t2);
    else
        return age(t1, t2);
    end if;
end $$;

一些例子:

with my_table(date1, date2) as (
values
    ('2012-11-30 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2012-12-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2013-01-31 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp),
    ('2013-02-28 00:00:00'::timestamp, '2012-10-31 00:00:00'::timestamp)
)

select *, age(date1, date2), age_m(date1, date2)
from my_table

        date1        |        date2        |      age       | age_m  
---------------------+---------------------+----------------+--------
 2012-11-30 00:00:00 | 2012-10-31 00:00:00 | 30 days        | 1 mon
 2012-12-31 00:00:00 | 2012-10-31 00:00:00 | 2 mons         | 2 mons
 2013-01-31 00:00:00 | 2012-10-31 00:00:00 | 3 mons         | 3 mons
 2013-02-28 00:00:00 | 2012-10-31 00:00:00 | 3 mons 28 days | 4 mons
(4 rows)


 类似资料:
  • 我有两次约会。一个是以YYYYMMDD格式从其他应用程序的表中检索的,第二个日期是本地时间,我需要这两个日期之间的天数/月/年。 我试过了 但这给了我一些乱七八糟的数字。 变量$t=Fri Dec31 00:00:00 9999 变量$今天=Wed Feb19 14:40:55 2020 产出:25182094888 有什么想法吗?提前谢谢。

  • 我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个

  • 在Netezza中,我们有一个months_-between函数,它给出两个日期之间的月份:我猜,它首先计算日期之间的天数,然后除以30? 有没有一种方法可以在netezza中编写sql,这样我就可以得到如下整数值:如果两个日期在同一个月内,则返回0。否则返回#个月。i、 e 2015年8月31日和2015年9月01日应返回1,因为它们在不同的月份。 如果我将months_between的o/p转

  • 问题内容: 我正在尝试列出两个日期之间的所有月份。 例如; 开始日期是:,最后日期是: 我想列出这样的东西: 这是我尝试过的,但根本没有用: 问题答案: PHP 5.3 PHP 5.4或更高版本 我们将开始日期和结束日期修改为每月第一天的部分很重要。如果我们不这样做,则当前日期要比2月的最后一天高(例如,非-年为28,leap年为29),则跳过2月。

  • 问题内容: 如果不使用PHP 5.3的date_diff函数(我使用的是PHP 5.2.17),是否有一种简单而准确的方法?我正在考虑以下代码,但是我不知道如何计算leap年: 我正在尝试计算一个人的月数。 问题答案: 您可能还希望将某天包括在内,具体取决于您是否指的是 整个 月。希望你能明白。

  • 问题内容: 如何使用PHP查找两个日期之间的天数? 问题答案: