【问题标题】:How to get only date/month part from a date in postgres SQL如何从 postgresQL 中的日期仅获取日期/月份部分
【发布时间】:2013-01-29 19:16:18
【问题描述】:

大家好 我的 pg admin 数据库中有一个表。此表中有一个 employee 表。具有该字段:- 1)名称 2)date_of_birth

现在的情况是我想知道当前日期和未来 20 天的生日 例如,如果当前日期是 2013 年 1 月 28 日,那么

1)from_date=28-Jan-2013
2)to_date=16-feb-2013

我想从表中选择所有记录 date_of_birth

lies between 28-Jan and 16-feb

【问题讨论】:

  • 隐藏年份对您来说很重要吗?

标签: sql postgresql


【解决方案1】:

试试这个:

SELECT *
FROM   bdaytable
WHERE  bdate >= '2013-01-28'::DATE
AND    bdate <= '2013-02-16'::DATE;

你也可以试试overlaps:

SELECT *
FROM bdaytable
WHERE (bdate, bdate) 
OVERLAPS ('2013-01-28'::DATE, '2013-02-16'::DATE);

with extract, month, day:

SELECT *
FROM   bdaytable
WHERE  Extract(month from bdate) >= Extract(month from '2013-01-28'::DATE)
AND    Extract(month from bdate) <= Extract(month from '2013-02-16'::DATE)
AND    Extract(day from bdate) >= Extract(day from '2013-01-28'::DATE)
AND    Extract(day from bdate) <= Extract(day from '2013-02-16'::DATE);

合并Now() 和interval 以使查询与当前日期动态:

SELECT *
FROM   bdaytable
WHERE  Extract(month from bdate) >= Extract(month from Now())
AND    Extract(month from bdate) <= Extract(month from Now() + Interval '20 day')
AND    Extract(day from bdate) >= Extract(day from Now())
AND    Extract(day from bdate) <= Extract(day from Now() + Interval '20 day');

【讨论】:

  • 谢谢亲爱的。但在我的情况下,年份并不重要,我只想考虑日期和月份
  • 请尝试编辑 :),extracts 太多会很难看,但应该可以。
  • 我认为条件使用不当
  • 当然,很好,如果它对你有用,请告诉我,很想知道;)
  • 另一种方法 - (bdate - date_trunc('year',bdate)) BETWEEN (now() - date_trunc('year',now())) AND (now() - date_trunc('year',now()) + interval '20 days')。这个想法 - 比较从年初开始的时间间隔。
【解决方案2】:
select *
from employee
where 
    to_char(date_of_birth, 'MMDD') between 
    to_char(current_date, 'MMDD') and to_char(current_date + 20, 'MMDD')

【讨论】:

  • 当当前日期接近(不到 20 天)到年底时,它会起作用吗?
  • 谢谢,一切正常。但如果 current_date 是 2012 年 11 月 20 日,to_date 是 2013 年 1 月 15 日,我希望按以下顺序得到结果:- 11 月的生日,11 月的生日十二月和一月的生日。我怎样才能做到这一点
  • @facebook 不要使用这个答案。正如伊戈尔已经指出的那样,这是错误的
  • @Clodoaldo 我已经修改它以适用于所有情况。我已经制定了 2 个日期范围。例如,如果日期是 2012 年 12 月 20 日。那么日期是:-2012 年 12 月,2012 年 12 月 31 日和 2013 年 1 月 1 日至 2013 年 1 月 8 日
  • @facebook 很有趣。您能否发布一个新问题,详细解释您的解决方案,然后询问订单问题?
【解决方案3】:

我认为这应该可行。使用interval。

SELECT * 
FROM Employee
WHERE Date_Of_Birth >= now() AND Date_Of_Birth <= now() + interval '20 day'

如果您想获得这几天之间的任何出生日期(年份无关紧要),那会略有不同。

编辑

如果年份无关紧要,虽然我确信有更好的方法,但这可能会奏效。基本上它只是将所有年份转换为普通年份(在本例中为 2000 年)——您也可以对输入参数执行相同操作。

(Date_Of_Birth + (2000-EXTRACT(YEAR FROM Date_Of_Birth) || ' years')::interval)

很好奇其他人过去使用了什么,因为这可能不是最有效的。

祝你好运。

【讨论】:

  • 嗨,正如你提到的,如果年份无关紧要。在我的情况下,年份无关紧要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2017-01-19
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多