如何在SQL中获取Month的日期

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

日期是20日:

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

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

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

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

回答(3)

2 years ago

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

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

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

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

2 years ago

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

希望能帮助到你 !

问候

2 years ago

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

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 .