2017-01-16 57 views
-2

是否有一种方法可以使用以下方案获取SQL中的特定日期;如何在SQL中获取月份的日期

的日期是20:

1)如果当前月份的日期是2017年1月23日的话,我想从1月20日得到的一切2017年即3天

2。 )如果当前月份的日期是2017年1月17日,那么我希望从2016年12月20日起获得所有内容。

因此,重点是当前月份的20日或基于当前日期的上个月。

有关如何在SQL中构造这个的任何想法?

+1

Whats DBMS are you using?另外你的日期列是什么样的?请举例 – Matt

+0

标记您正在使用的dbms。 (当涉及到日期/时间时,许多产品远不符合ANSI SQL标准。)还要添加一些示例表格数据和预期结果 - 以及格式化文本。 – jarlh

+0

如果日期是第20天,那么前一个或下一个月的数据是什么? – Matt

回答

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

我通常建立这种操作的一些功能,它可以在时间而改变,这是很容易modificable。

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一句话把它叫做:

select StartDate, EndDate from GetDates(14); 

可以试试here

相关问题