2017-03-17 10 views
-3

日付が今日で日付が2年の倍数である日付レコードを1つのデータベースからSELECTする方法があります。日付が今日と複数であるデータベース日付からのSELECT

たとえば、テーブル呼び出し「リスト」があります。そのテーブルには2つの列、 'ID'と 'last_date'があります。このレコードの1つは、ID = '1'と日付= '17 -03-2015 'です。

日付がテーブルの日付+ 2年であるすべてのレコードを選択する必要があります。たとえば今日のクエリではID 1が返されます。

ありがとうございます。

+0

(...そのmydatecolはDATETIMEとして定義されていると仮定)。それはT-SQLではなくMySQLです。 – Barmar

+0

クエリを書く上で、 'last_date'カラムの*データ型*(' DATE'、 'DATETIME'、' VARCHAR')はカラムの* name *と同じくらい重要です。 (この例の値 ''17 -03-2015''は、MySQLの' DATE'の標準形式では* not *です。これは列が 'DATE'として宣言されないかもしれないというヒントです)。 – spencer7593

答えて

0

DATE_SUB()を使用して、今日の日付から2年を減算し、それを列と比較します。

SELECT id 
FROM list 
WHERE last_date = DATE_SUB(CURDATE(), INTERVAL 2 YEAR); 

これは、テーブル内のすべての行ではなく、1回だけ計算する必要があるため、@ Tejaのソリューションより少し優れています。また、last_date列に索引がある場合、索引を使用して行をすばやく見つけることができます。

0

私たちは、正確に2日今日の日付より前の日付値を返す式を書くことができます:

SELECT DATE(NOW()) + INTERVAL -2 YEAR 

我々は、クエリのWHERE句で式を使用することができます。それはDATETIMEとして定義されていた場合は、列は次のように格納されている場合、通常のパターンは、範囲チェック

SELECT t.id 
    FROM mytable t 
    WHERE t.mydatecol >= DATE(NOW()) + INTERVAL -2 YEAR 
    AND t.mydatecol < DATE(NOW()) + INTERVAL -2 YEAR + INTERVAL 1 DAY 

だろう

SELECT t.id 
    FROM mytable t 
    WHERE t.mydatecol = DATE(NOW()) + INTERVAL -2 YEAR 

:我々はチェックしたいテーブルのカラムはDATEデータ型として定義されている場合例:非正規形式のVARCHAR DD-MM-YYYY次に、STR_TO_DATEを使用してDATEに変換しようとするか(問合せが索引を有効に使用できないために実行したくない)、または生成された日付値を等価比較のために必要な文字列形式:'17 -03-2015' に私たちに完全一致になるだろう

SELECT t.id 
    FROM mytable t 
    WHERE t.ddmmyyyy = DATE_FORMAT(DATE(NOW()) + INTERVAL -2 YEAR,'%d-%m-%Y') 

ではなく、'17に-3-2015' 。そして、平等テストまたはINリストを実行する必要があります。列に格納されている値が標準ではないため、範囲チェックを実行できません。


我々は6年前、4年前、2年前、今日...複数の日付を探すために必要がある場合は、...我々は、日付のリストを生成し、結合操作を実行することができます。彼は、特定の日付ではなく、範囲を探している@ShawnMehan

SELECT t.id 
    FROM (SELECT DATE(NOW()) + INTERVAL 0 YEAR AS dt 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -2 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -4 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -6 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -8 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -10 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -12 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -14 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -16 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -18 YEAR 
      UNION ALL SELECT DATE(NOW()) + INTERVAL -20 YEAR 
     ) l 
    JOIN mytable t 
    WHERE t.mydatecol >= l.dt + INTERVAL 0 DAY 
    AND t.mydatecol < l.dt + INTERVAL 1 DAY 
関連する問題