CSVファイルをADOで扱う連載の12回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org
日付、時刻の処理
前回は、FORMAT を使用した日付、時刻の処理方法についてご紹介しました。
今回は日付、時刻のデータを使って色々な処理をしてみようと思います。
今回もSQLを指定してCSVファイルを確認できるツール(CSV_ReaderSQL)を使います。ツールは以下からダウンロードしてください。
CSV_ReaderSQL110.zip - Google ドライブ
今までと同じようにCSV_ReaderSQLで操作対象のファイル(Test.csv)があるフォルダーを指定しておきましょう。'Test.csv'の内容は以下の様になっているものとします。
"氏名","生年月日","入会日" "大山洋子","2001/03/06","2018/08/02" "宮崎進","2010/12/30","2017/01/09" "鈴木麻衣","1998/02/08","2019/10/16" "青山ゆきお","2000/01/05","2018/05/21"
2つの日付間の日数を取得する
2つの日時からその経過時間を算出できると便利です。入会日から何日経過したかを算出してましょう。
SQLコマンド欄に以下を入力して実行ボタンを押してみましょう。
SELECT 氏名 ,DATEDIFF('d',入会日,NOW) As 在会日数 FROM [Test.csv]
結果は以下の様になりました。入会日から現在(2021年9月25日)までの経過日数が算出されています。
氏名 | 在会日数 |
---|---|
大山洋子 | 1150 |
宮崎進 | 1720 |
鈴木麻衣 | 710 |
青山ゆきお | 1223 |
NOWはシステムから取得した現在の日時を返します。 また、DATEDIFF は、2つの日時の差を返します。表記方法は以下の通りです。
DATEDIFF(時間単位、日時1、日時2)
これで、日時2から日時1を引いた値を返します。値は時間単位で設定した単位で返されます。以下の表を参考にしてください。
記号 | 単位 |
---|---|
yyyy | 年 |
q | 四半期 |
m | 月 |
d | 日 |
w | 平日 |
ww | 週 |
h | 時 |
n | 分 |
s | 秒 |
誕生日から年齢を算出する
2つの日時からその経過時間を算出できるということは、誕生日を記録しておけば、その人の現在の年齢が判るということです。名簿の管理などで使えます。ここで重要なのは、年齢は年の差だけではなくて誕生日を境に加算されるということです。 以下のSQLを入力して実行してみまょう。
SELECT 氏名 ,DATEDIFF('yyyy',生年月日,NOW) + (FORMAT(生年月日,"mmdd") > FORMAT(NOW,"mmdd")) As 年齢 FROM [Test.csv]
FORMAT(生年月日,"mmdd") > FORMAT(NOW,"mmdd")の部分に注目していただきたいです。現在の年月が誕生日の年月よりも前かどうかを判定しています。ADOのSQLの場合、判定式が成立すると「-1」を返します。つまり、年の差から誕生日を迎えていない場合は年数の差から1を引いています。 結果は以下の様になりました。現在(2021年9月25日)の年齢が算出されています。
氏名 | 年齢 |
---|---|
大山洋子 | 20 |
宮崎進 | 11 |
鈴木麻衣 | 23 |
青山ゆきお | 21 |
曜日で選択する
FORMATを使用すれぱ日付の曜日も取得できます。つまり、日付が判れば曜日を指定してデータを選択したりできるということです。CSVファイル上に曜日のデータはいらないのです。月曜日に入会した人の氏名を抽出してみましょう。以下のSQLを入力して実行してみます。
SELECT 氏名 FROM [Test.csv] WHERE FORMAT(入会日,"ddd") = 'Mon'
結果は以下の様になりました。以下の二人が月曜日に入会しています。
氏名 |
---|
宮崎進 |
青山ゆきお |
次回は色々な選び方
今回は、 日付、時刻データの応用についてご紹介しました。アイディア次第で色々な応用ができると思います。 次回は色々な選び方です。以前、SQLのSELECT句を使って行を絞り込んで選択する方法をご紹介したと思うのですが、他にも色々な選択方法があるんですよ。次回は、これをご紹介しようと思います。お楽しみに!!