2014年12月9日火曜日
EXCELの日付の差分の求め方
特によく使用するのは、こちら。
=(B2-A2)*1440 2 つの時刻の差を分単位で求めます。
=(B2-A2)*86400 2 つの時刻の差を秒単位で求めます。
開始と終了時刻の差分など、使用する機会が最近多い。
参考サイト : 2 つの時刻間の差分を計算する
http://office.microsoft.com/ja-jp/excel-help/HP010070468.aspx
2014年12月2日火曜日
既存テーブルのオートナンバーの割り振り方(主キー以外をキーにする場合)
SQLServerでオートナンバー列を新たに設定するが、
主キーの順番に自動で割り振られるだけ。
今回の主キー以外の順番(登録日時順とか)で割り振りたい場合には、向いていない。
そこで以下の方法を検討した。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
1) ワーク用テーブル「HogeA」を作成する。
※ InsDate(データ登録日時)の昇順で、番号を割り振る。
SELECT
PrimaryNo
,InsDate
,ROW_NUMBER() OVER(ORDER BY InsDate ASC) AS sequence
INTO HogeA
FROM MasterA
;
2) 「MasterA」に、デザインからオートナンバー列「sequence(BigInt)」を追加する。
※ このままでは番号は主キーの順番になるだけなので注意!
3) 「MasterA」に、オートナンバー列「sequence」のidentityを「いいえ」にする。
4) 「MasterA」と 1)で作成したテーブルをJOINさせて、再度割り当てる。
UPDATE MasterA
SET MasterA.sequence = HogeA.sequence
FROM MasterA
INNER JOIN HogeA
ON MasterA.PrimaryNo = HogeA.PrimaryNo
;
5) 「MasterA」に、オートナンバー列「sequence」のidentityを「はい」に戻す。
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
途中のデータを削除しても、
INSERTする際にはきちんと次の値として採番してくれているため、
問題ないと思われる。
以上
主キーの順番に自動で割り振られるだけ。
今回の主キー以外の順番(登録日時順とか)で割り振りたい場合には、向いていない。
そこで以下の方法を検討した。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
1) ワーク用テーブル「HogeA」を作成する。
※ InsDate(データ登録日時)の昇順で、番号を割り振る。
SELECT
PrimaryNo
,InsDate
,ROW_NUMBER() OVER(ORDER BY InsDate ASC) AS sequence
INTO HogeA
FROM MasterA
;
2) 「MasterA」に、デザインからオートナンバー列「sequence(BigInt)」を追加する。
※ このままでは番号は主キーの順番になるだけなので注意!
3) 「MasterA」に、オートナンバー列「sequence」のidentityを「いいえ」にする。
4) 「MasterA」と 1)で作成したテーブルをJOINさせて、再度割り当てる。
UPDATE MasterA
SET MasterA.sequence = HogeA.sequence
FROM MasterA
INNER JOIN HogeA
ON MasterA.PrimaryNo = HogeA.PrimaryNo
;
5) 「MasterA」に、オートナンバー列「sequence」のidentityを「はい」に戻す。
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
途中のデータを削除しても、
INSERTする際にはきちんと次の値として採番してくれているため、
問題ないと思われる。
以上
2014年12月1日月曜日
SQLServerのDumpが復元できない!?
> 復元さき
SQLServer2005
> 復元もと
SQLServer2014
・・・という状況で復元しようとしたら、
「メディア ファミリが正しい形式ではありません。」
という見慣れないエラーメッセージが発生した。
はじめはデータが壊れているのかと思った。
しかし調査した結果、そうではない。
「下位バージョンでは、バックアップファイルをリストアできません。」
との情報があり。
解決策はスクリプトにデータを出力するとか。
4GBを超えており、どう考えてもお手軽ではない・・・・。
どうしても必要というわけではないため、諦めることにした。
(参考)
http://nusoft.jp/blog/archives/118
2014年11月21日金曜日
カンマ区切りの列を、縦に整形して表示する方法
Kapowでロボットを組む際に、どうしようか考えていた。
特定の文言たちを1列にカンマ区切りで指定する仕様を検討中のため、
いくつ入ってくるかわからない。
それをKapowの変数に格納しなければならないが、それが可変では困る!
Kapowにとっては、ループで何行あろうが関係ないループ処理でできてくれるのが一番いい。
となると、MySQLで勘考してくれるのが一番だと考えた。
その結果が以下である。
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(NGWord,',',v.n),',',-1) as NGwords
FROM (SELECT NGWord FROM test01) AS c,
( SELECT 1 n
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
) AS v
WHERE LENGTH(NGWord)-LENGTH(REPLACE(NGWord,',',''))+1 >=v.n
特定の文言たちを1列にカンマ区切りで指定する仕様を検討中のため、
いくつ入ってくるかわからない。
それをKapowの変数に格納しなければならないが、それが可変では困る!
Kapowにとっては、ループで何行あろうが関係ないループ処理でできてくれるのが一番いい。
となると、MySQLで勘考してくれるのが一番だと考えた。
その結果が以下である。
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(NGWord,',',v.n),',',-1) as NGwords
FROM (SELECT NGWord FROM test01) AS c,
( SELECT 1 n
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
UNION ALL SELECT 8
UNION ALL SELECT 9
UNION ALL SELECT 10
) AS v
WHERE LENGTH(NGWord)-LENGTH(REPLACE(NGWord,',',''))+1 >=v.n
test01テーブルに、カンマ区切りの文字列が保持されているNGWordを用意して、
上記SQLを実行させた。
ただし仮にカンマ区切りで13個あったとしても、UNION ALLたちが10個までしかないため、
10個までしか出力されない。
どっちみち仕様として利用者には、「10個までならカンマ区切りで指定可能」と
言ってしまえば運用上問題なし!!
詳細なことは、以下のURLへ飛んでください。
(参考URL)
BAD DB設計に対するSQLパターン応用編1 カンマ区切りのカラムを列(縦方向に分解)Comments
http://d.hatena.ne.jp/IT7C/20130217/1361039857
2014年11月19日水曜日
phpExcelでの画像サイズと、EXCELの印刷時の注意
写真サイズの、Lサイズ(89×127)の場合。
$hoge->setHeight(336.3);
$hoge->setWidth(479.8);
setHeightとsetWidthに対して、
上記のように指定すると、Lサイズで画像がEXCELに出力される。
しかしEXCELの印刷プレビューをすると、少し大きく表示されてしまう。
画像の間隔に余白がない状態だ。
(Microsoftには、シートの状態と印刷プレビューの状態で見え方が異なる状態を早く直して頂きたい・・)
なお、余白はデフォルトのままである。
※ 上下:1.9、左右:1.8、ヘッダ&フッタ:0.8
従って、上記の設定値の95%を設定するが、
これでは確かに印刷プレビューではおさまっているようにみえるが、
最後の3ページ目がなぜか4ページ目にはみでてしまうため、さらに縮小する必要があった。
$hoge->setHeight(319.5);
$hoge->setWidth(455.8);
最終的には、初めの設定値の92%に収まった。
※ 次のページに少し出ない、ぎりぎりのサイズ
$hoge->setHeight(309.4);
$hoge->setWidth(441.4);
さらにEXCELの中身も注意しなければならない。
シート全体を印刷範囲クリアをしたとしても、
以前に編集したことがあれば、その部分まで印刷されてしまう。
つまり3ページで画像が終わりだとしても、空白の状態で4・5ページ目が出力される。
よってそういうときは、該当行をすべて削除してしまえばいい。
$hoge->setHeight(336.3);
$hoge->setWidth(479.8);
setHeightとsetWidthに対して、
上記のように指定すると、Lサイズで画像がEXCELに出力される。
しかしEXCELの印刷プレビューをすると、少し大きく表示されてしまう。
画像の間隔に余白がない状態だ。
(Microsoftには、シートの状態と印刷プレビューの状態で見え方が異なる状態を早く直して頂きたい・・)
なお、余白はデフォルトのままである。
※ 上下:1.9、左右:1.8、ヘッダ&フッタ:0.8
従って、上記の設定値の95%を設定するが、
これでは確かに印刷プレビューではおさまっているようにみえるが、
最後の3ページ目がなぜか4ページ目にはみでてしまうため、さらに縮小する必要があった。
$hoge->setHeight(319.5);
$hoge->setWidth(455.8);
最終的には、初めの設定値の92%に収まった。
※ 次のページに少し出ない、ぎりぎりのサイズ
$hoge->setHeight(309.4);
$hoge->setWidth(441.4);
さらにEXCELの中身も注意しなければならない。
シート全体を印刷範囲クリアをしたとしても、
以前に編集したことがあれば、その部分まで印刷されてしまう。
つまり3ページで画像が終わりだとしても、空白の状態で4・5ページ目が出力される。
よってそういうときは、該当行をすべて削除してしまえばいい。
2014年11月18日火曜日
phpExcelの画像サイズが統一されない原因について
setHeightとsetWidthで指定をしても、画像が統一されていなかったが、
それはデフォでは、「縦横比を固定する」が効いているからである。
したがって、ソースに
「$hoge->setResizeProportional(false);」
を追加してあげて、固定しないとすれば問題ない。
(参考)
http://docolog.cocolog-nifty.com/papalog/2012/02/php-phpexcel-f9.html
phpExcelについて
こちらの注意点を2点列挙する。
(1)
ソースファイルをUTF-8で保存する際に、
BOMを付加させて保存すると、EXCEL出力時にファイルが壊れているとエラーメッセージが表示されて、開くことができない。
(2)
EXCELに貼り付ける画像の縦横を調整する、setWidthAndHeightなどが存在するが、決して指定したどおりに全ての画像がそろってくれるわけではない。
つまり貼り付けるオリジナルの画像の大きさがバラバラだとしたら、出力されたEXCEL内の画像もバラバラだったりする。
登録:
投稿 (Atom)