繁体   English   中英

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

[英]How to get from a date column the last date of the previous month?

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

问题是如果 A_date 的日期是当月的 30 日或 31 日,那么 E_date 的日期需要是当月的最后一天,而不是下个月的第一个或第二个工作日。

我试过 eomonth function 但这不起作用,因为它需要一个明确的日期。

你知道如何解决它吗?

我不确定你的问题是什么。 到目前为止,我所了解的是,您希望当月的最后一个日期在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

试试上面的设置,如果它解决了你的问题,请告诉我!

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

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

在 Oracle 中:

LAST_DAY(ADD_MONTHS(mydate ,-1))

在 MySQL 中:

LAST_DAY(mydate - INTERVAL 1 MONTH)

在 SQL 服务器中:

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

在 Postgres 中:

date_trunc('month', now())::mydate - 1
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

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

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

例子:

EOMONTH(A_date)

有两个日期列,仅考虑工作日。 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

如果您真的只希望在任何给定月份的 30 日或 31 日而不是任何一个月的最后 2 天(因为显然不是每个月都有 31 天)--

select A_date
   ,case when day(A_date) >= 30
       then eomonth(A_date)
       else dateadd("dd",2,A_date)
    end as E_date

其他答案适用于“任何一个月的最后 2 天”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM