質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • SQL

    2323questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • SQL Server

    572questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

テーブルデータを削除するSQLの構文について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,975

CS12

score 11

SQLの経験が浅いため、おかしな点がありましたらご容赦ください。

テーブルの中のデータ削除処理をバッチ実行したいのですが、そもそものSQLの構文がよくわかりません。
どなたがご教示いただけると助かります。

 ・テーブル名:ddo.SOKUTEI
 ・フィールド名(長さはすべて8桁)
  日付 varchar
  時間 varchar
  測定1 float
  測定2 float

 ・現在の日付から2年前のデータが削除対象
 ・「日付」フィールドにはvarchar 8桁で日付が格納
  例:20131102

 「日付」フィールドは日付型ではないので下記構文は誤りだと思いますが、
  どのように記述したら良いかがわかりません。

 考えた構文
DELETE FROM dbo.SOKUTEI WHERE 日付 < (SELECT DATEADD(year,(-2),GETDATE()));
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

書き方からSQLServerと推測しますが、こんな感じでしょうか。

 
DELETE FROM dbo.SOKUTEI WHERE 日付 < CONVERT(VARCHAR(8),DATEADD(y,-2,GETDATE()),112);
CONVERT関数の第3引数の「111」は日付の書式で色々種類があります。下記リンク先を参照してください。
CONVERTの日付書式設定(MSDN)
CONVERT関数でVARCHARのサイズを指定していますが、こうすると返還後のサイズに収まらない分は勝手に切られます(←これが思いのほか便利だったりします)。
上記SQLは、日付がyyyymmdd形式であることを想定しています。
年月日の区切り文字があって時刻も付いている場合はVARCHAR(10)にして上げると良いです。
↓こんな感じになります。
「2015-02-19 23:51:00」 → 「2015-02-19」

日付のフォーマットが統一されていれば文字列比較でも問題ないかと思います。
どうしてもDATE型で比較したいのであれば、両辺にCONVERT(DATE,[項目名])とかしてあげるとよいかと思います。
注意点として、テーブルのデータ量が多い場合はWHERE句での型変換は避けたほうが良いです。
パフォーマンスが劇的に落ちます。
ストアドにできるのであれば、ストアド内で変数を宣言して利用するほうが実行速度が上がります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/23 14:44

    回答が遅くなりまして申し訳ありません。
    日付のフォーマットは統一されておりますので、文字列比較OKでした。
    ありがとうございます。

    キャンセル

+2

実行していませんので、動くかは分かりませんが...
下に行く程、自信がありません :p

基本的な考え方は同じですね。
まず、2年前を求め、文字列に変換して比較しています。

  • Oracle の場合
DELETE FROM ddo.SOKUTEI
WHERE
    日付 < TO_CHAR(ADD_MONTHS(SYSDATE, -24), 'YYYYMMDD')

  • MySQL の場合
DELETE FROM ddo.SOKUTEI
WHERE
    日付 < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL -24 MONTH), '%Y%m%d')

  • PostgreSQL の場合
DELETE FROM ddo.SOKUTEI
WHERE
    日付 < TO_CHAR(CAST(NOW(), AS DATE) + CAST('-24 months' AS INTERVAL), 'YYYYMMDD')

お願い
上記の通り、RDBMSによって記述が大きく異なります。
SQL + 使用しているRDBMS のタグがあれば回答しやすいです!
よろしくお願いいたします :)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/02/23 14:46

    回答が遅くなり申し訳ございません。
    RDBMSはSQL Serverでした。情報不足で申し訳ありません。
    SQL Server以外の構文も記載していただき、ありがとうございました。
    SQL Server以外ではOracleも使用することがありますので、参考にいたします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • SQL

    2323questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

  • SQL Server

    572questions

    SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。