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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

3回答

6035閲覧

SQlite3で、年、月、日のフィールドがわかれているテーブルの日付をbetweenで期間を指定して取得する方法

GiveAHand

総合スコア286

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

1グッド

1クリップ

投稿2016/05/23 03:33

SQlite3のデータを取得してエクセルにセットするプログラムを作成しています。

sqlite3

1CREATE TABLE `TABLE_DATA` ( 2 `YEAR` INTEGER NOT NULL, 3 `MONTH` INTEGER NOT NULL, 4 `DAY` INTEGER NOT NULL, 5 `DATA` TEXT, 6 PRIMARY KEY(YEAR,MONTH,DAY) 7);

このようなテーブルのデータを、年月日の期間を指定して、betweenで取得出来ないかと考えています。

例えば、

sql

1SELECT COUNT(*) FROM TABLE_DATA WHERE date(YEAR & "/" & MONTH & "/" & DAY) BETWEEN '2016/05/01' AND '2016/05/31';

こんな感じで、一発でSQLで期間指定のデータを取得する方法はないものなのでしょうか?

KiyoshiMotoki👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

SQliteには文字列フォーマット関数が無いようなので、
8ケタの数値に変換して、それを使った方が早そうですね。

sql

1select * from table_data 2 where year * 10000 + month * 100 + day between 20160501 and 20160531

常に月単位指定なのであれば、
select * from table_data where year = 2016 and month in (4, 5)
みたいにするのもアリだと思いますよ。

投稿2016/05/23 06:06

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/05/24 01:59

argius様 あぁ、なるほど! そんな方法もあるんですね! すごいです!!! ありがとうございました!
GiveAHand

2016/05/24 02:01

あと、蛇足ですが、argiusさん、ランキングの獲得ぶりがすごいですね。 恐れいりますm(_ _)m
argius

2016/05/24 03:46 編集

"/"||TABLE_DATA.MONTH||"/"だと /5/ になってゼロが入らないので上手くいかないと思いますけど。 "2016/5/1"と"2016/05/01"は一致しません。 それと文字列はシングルクォーテーションで囲った方が良いです。 ダブルクォーテーションだと文字列としては意図しない動作になることがあります。 ランキングは長くやっているのとそのカテゴリーの質問の数が少ないので取れてしまっているだけですが、 ありがとうございます。
GiveAHand

2016/05/24 05:27

argius様 なるほど! いろいろとありがとうおざいます! 勉強になりますm(_ _)m
guest

0

ちょっと無理やりですが。

sql

1SELECT COUNT(*) FROM TABLE_DATA 2 WHERE strftime('%Y/%m/%d', YEAR || '-01-01', (MONTH-1) || ' months', (DAY-1) || ' days') 3 BETWEEN '2016/05/01' AND '2016/05/31';

投稿2016/05/24 03:01

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GiveAHand

2016/05/24 05:28

fuzzball様 なるほど。 ありがとうございます!
guest

0

ベストアンサー

||を使うとできますよ。

SQL

1SELECT COUNT(*) FROM TABLE_DATA WHERE TABLE_DATA.YEAR||"/"||TABLE_DATA.MONTH||"/"||TABLE_DATA.DAY BETWEEN '2016/05/01' AND '2016/05/31';

投稿2016/05/23 06:08

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yona

2016/05/23 06:11

0で始まる時は対応できてないですね。
GiveAHand

2016/05/24 01:58

yona様 ありがとうございます! うまくいきました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問