人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Google Visualization api を使ってGoogle スプレッドシートに入れた情報を表示させています。スプレッドシートのD列には「2012/05/15」のような日付けが入っていますので、select * where D < now() などとsql文を書いて行を選択しています。
さて、ここからが質問です。
今月の行を選択するには、select * where month(now()) = month(D)";でできたのでが、今日から「30日前」や「2週間前」を選択するsql文がわりません。今日から「30日前」は、select * where D >= date 'today' - integer '30'";としてみたのですがダメでした。正しいsql文をご教示いただけませんか?

●質問者: ozaki
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● Cherenkov
●200ポイント ベストアンサー

Query Languageで日付の作り方がわからなかったのでJSで日付を作ってます。
→dateDiff()を使えば解決した。ソースのコメント参照。


30日前で検索。

<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
 google.load("visualization", "1");
</script>
<script>
//Google Spreadsheets を簡易 SQL DB に!「Google Visualization API」 - WebOS Goodies
//http://webos-goodies.jp/archives/51310352.html
function handleResponse(response) {
 var data = response.getDataTable();
 var csv = [];
 for (var row = 0; row < data.getNumberOfRows(); row++) {
 var line = [];
 for (var col = 0; col < data.getNumberOfColumns(); col++)
 line.push(data.getFormattedValue(row, col));
 csv.push(line.join(","));
 }
 alert(csv.join("\n"));
}
/*
//getNdate(2)で2日後。getNdate(-5)で5日前
//return ex "2012-5-18"
function getNdate(n) {
var d = new Date(new Date().getTime() + (86400000 * n));
var nd = [d.getFullYear(), d.getMonth()+1, d.getDate()].join('-');
return nd;
}
 */
var url = 'GoogleスプレッドシートURL';
var query = new google.visualization.Query(url);
//D列の値が現在日時から30日前ならば、その行を取得。GMTなので注意。
query.setQuery('where dateDiff(D, now()) = -30');
//過去に提案したもの
//query.setQuery('where D = date "' + getNdate(-30) + '"');
query.send(handleResponse);
</script>
</head>
<body>
</body>
</html>

参考


ozakiさんのコメント
申し訳ないですが、難しすぎて分かりません。Googleスプレッドシートを公開いたしましたので、下記Javascriptのコードの中の「query_opts.sql = "select * ";」を変更するカタチでご教示いだけませんでしょうか?

Cherenkovさんのコメント
>|javascript| //この関数をどこかに追加して function getNdate(n) { var d = new Date(new Date().getTime() + (86400000 * n)); var nd = [d.getFullYear(), d.getMonth()+1, d.getDate()].join('-'); return nd; } //query_opts.sql = "select * ";を query_opts.sql = 'where D = date "' + getNdate(-30) + '"'; ||<

ozakiさんのコメント
ありがとうございます。見事目的を達することができました。 ただ、関数を新たにつくるのではなく、sql文で選択することはできますでしょうか?

Cherenkovさんのコメント
まずQuery LanguageはSQLではありません。 回答1に貼り付けたリファレンス眺めてもわかんないです…。 文字列連結とかあればできるのかな。 乱暴に月部分を-1なら以下で取得できましたが… select * where day(now()) = day(D) AND month(now())-1 = month(D)

Cherenkovさんのコメント
わかりました! where dateDiff(now(), D) = 30 これでどうでしょう。30日前。グリニッジ標準時ですが。

Cherenkovさんのコメント
where dateDiff(D,now()) = -30 こっちのほうが自然でした。

ozakiさんのコメント
dateDiffを使うんですね。いろいろ調べていただいてありがとうございました。これで当初の目的を達することができました。感謝です!!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ