2017-01-16 12 views
-2

には、次のシナリオを使用してSQLで特定の日付を取得する方法があります。SQLで月の日付を取得する方法

日が20日である:

1)現在の月の日付が2017年1月23日であるならば、私は3日

2すなわち2017年1月20日からすべてを取得したいと思います。現在の月の日付が2017年1月17日であれば、2016年12月20日からすべてを取得したいと考えています。

したがって現在の月または前月の20日が現在の日付に基づいています。

これをSQLで構造化する方法についてのアイデアはありますか?

+1

あなたはDBMSを使用していますか?また、あなたの日付の列はどうですか?例を与えてください – 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を使用して、この2番目の固定日付と最初の日付との関係を決定します。同じ月または前の日付ですか?

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 

次に、あなたが参加文に追加するか、直接のような選択文を使用して、それを呼び出すことができます。hereそれを試すことができます

select StartDate, EndDate from GetDates(14); 

関連する問題