如何从日期列中获取上个月的最后日期?

时间:2019-09-19 08:06:13

标签: sql sql-server date

我有两个日期列,仅考虑工作日。 A_date和E_date。 计算出的E_date是A_date的+2天,因为这是请求

问题是,如果A_date的日期是该月的30号或31号,则E_date日期必须是当月的最后一天,而不是下个月的第一个或第二个工作日。

我已经尝试了eomonth函数,但是该方法不起作用,因为它需要一个明确的日期。

您知道如何解决吗?

6 个答案:

答案 0 :(得分:1)

我不确定您的问题是什么。到目前为止,我所了解的是,如果要向A_Date添加两天,则需要该月的最后一个日期。

您为什么不使用CASE WHEN并用这种方式比较月份:

DECLARE @A_Date date = '2019/09/30';
DECLARE @A_Date_Month int = 0;
DECLARE @E_Date_Month int = 0;

SELECT @A_Date_Month = Month(Cast(@A_Date AS datetime));
SELECT @E_Date_Month = Month(DATEADD(day, 2, @A_Date));

SELECT CASE 
        WHEN @A_Date_Month = @E_Date_Month 
        THEN DATEADD(day, 2, @A_Date) 
        ELSE EOMONTH(@A_Date) END AS OUTPUTValue

尝试以上设置,并让我知道它是否可以解决您的问题!

答案 1 :(得分:0)

  

如何从日期列中获取上个月的最后日期?

这取决于您的RDBMS,所以让我们借此机会做出一个通用的答案:

在Oracle中:

LAST_DAY(ADD_MONTHS(mydate ,-1))

在MySQL中:

LAST_DAY(mydate - INTERVAL 1 MONTH)

在SQL Server中:

DATEADD(MONTH, DATEDIFF(MONTH, -1, mydate )-1, -1)
-- or simply:
EOMONTH(DATEADD(Month, -1, mydate ))

在Postgres中:

date_trunc('month', now())::mydate - 1

答案 2 :(得分:0)

SELECT CASE WHEN dateadd(month,1+datediff(month,0,A_date),-1)< DATEADD(day, 2, A_date) THEN dateadd(month,1+datediff(month,0,A_date),-1) ELSE DATEADD(day, 2, A_date) END E_date

2019/09/30输出的FOR输入是2019-09-30 00:00:00.000

答案 3 :(得分:0)

您可以在SQLServer中使用 EOMONTH()来获取每月的最后一天。

示例:

EOMONTH(A_date)

答案 4 :(得分:0)

  

有两个日期列,仅考虑工作日。 A_date和E_date。计算出的E_date是A_date的+2天,因为这是请求

我会简单地做:

(case when dateadd(day, 2, a_date) < eomonth(a_date)
      then dateadd(day, 2, a_date)
      else eomonth(a_date)
 end) as e_date

答案 5 :(得分:0)

如果您真正只想在给定月份的30号或31号而不是每个月的最后2天这样做(因为显然不是每个月都有31天)-

import {UpdatingElement, customElement} from 'lit-element';
import content from './someContent.html';

@customElement('some-element')
export class SomeElement extends UpdatingElement {

  constructor() {
    super();
    this.shadowRoot.innerHTML = content;
  }

}

其他答案适用于“每月的最后2天”。