首页 文章

如何在SQL中获取Month的日期

提问于
浏览
-2

有没有办法使用以下方案在SQL中获取特定日期;

日期是20日:

1.)如果当月的日期是2017年1月23日那么我想从2017年1月20日开始,即3天

2.)如果当月的日期是2017年1月17日,那么我想从2016年12月20日开始收到所有信息 .

因此,焦点是当前日期的20日或前一个月的日期 .

关于如何在SQL中构建它的任何想法?

3 回答

  • 0

    这个表达式应该找到过去一个月中最近的20个月:

    select
        DATEADD(month,
            DATEDIFF(month,'20010101',GETDATE()),
            CASE WHEN DATEPART(day,GETDATE()) < 20  THEN '20001220'
                                                    ELSE '20010120' END)
    

    它的工作原理是计算过去和今天某个固定日期之间的整数月份 .

    然后我们将这个月数添加到另一个固定日期 - 一个月的20日 . 但我们使用 CASE 来决定第二个固定日期与第一个固定日期的比较 - 是同月还是前一个?

  • 0

    你总是可以使用MONT(日期字段)来获取日期月份的数值,你可以在上个月做-1,YEAR(日期字段)的工作方式相同 .

    希望能帮助到你 !

    问候

  • 0

    我通常会为这种操作构建一些函数,它可以及时更改并且很容易修改 .

    CREATE FUNCTION GetDates(@Day int)
    RETURNS @DateRange TABLE
    (
        StartDate DATETIME,
        EndDate DATETIME
    )
    AS
    BEGIN
        DECLARE @StartDate VARCHAR(30),
                @EndDate VARCHAR(30),
                @CurDate DATETIME,
                @CurDay INT;
    
        SET @CurDate = GETDATE();
        SET @CurDay = DAY(GETDATE());
        SET @EndDate = CONVERT(VARCHAR(30), @CurDate, 112);
    
        IF @CurDay <= @Day
        BEGIN
            SET @StartDate = CONVERT(VARCHAR(30), DATEADD(day, (@Day - @CurDay), DATEADD(month, -1, @CurDate)), 112);
        END
        ELSE
        BEGIN
            SET @StartDate = CONVERT(VARCHAR(30), DATEADD(day, (@Day - @CurDay), @CurDate), 112);
        END
    
        INSERT INTO @DateRange VALUES (CAST(@StartDate AS DATETIME), CAST(@EndDate AS DATETIME));
        RETURN
    END
    GO
    

    然后你可以将它添加到连接句子,或者使用如下的选择句子直接调用它:

    select StartDate, EndDate from GetDates(14);
    

    可以试试here .

相关问题