Oracle の add_months を SQL Server dateadd(month, ~) の結果と同じにするのを考えてみる‏

twitter で見かけたのでちょっと考えてみる。

SQL Server

select dateadd(month, 1, cast('2016/02/29' as date)) -- 2016/03/29

Oracle

select add_months('2016/02/29', 1) from dual -- 2016/3/31

足す前の日付と足した後の日付の 日 の部分が違った場合で、足した後の方が大きい時だけ問題になるで良いのかな。

  1. 日が同じ => 問題無し
  2. 日が違って、足した時の方が小さい => 足す前の 日 が足した後の月に存在しない 例:1/30 に 1ヶ月足したら 2/28 or 2/29 になるパターン
  3. 日が違って、足した時の方が大きい => 足す前が月末日、足す前の月の日数が足した後の月の日数より少ない。例:4/30 に 1ヶ月足したら 5/31

最後のパターンだけ差し替えるとこんな感じ。*1

create or replace function ADD_MONTHS_SQLSERVER(target date, plus number) return date
is 
  result date;
begin
  select add_months(target, plus) into result from dual;
  select 
    case 
      when to_char(result, 'DD') > to_char(target, 'DD')   
        then to_date(to_char(result, 'YYYYMM') || to_char(target, 'DD'), 'YYYYMMDD')
      else result 
    end into result
  from dual;
  
  return result;
end;

function 作るのいやだったらこんな感じ?

select
  case when to_char(add_months(sysdate, 2), 'DD') > to_char(sysdate, 'DD')
    then to_date(to_char(add_months(sysdate, 2), 'YYYYMM') || to_char(sysdate, 'DD'), 'YYYYMMDD')
    else add_months(sysdate, 2)
  end as add_months_sqlserver
from dual

LAST_DAY とか使うかなーと思ったけど、そうでもなかった。
※雰囲気動くとこまでしか確認してないから利用は自己責任で!

*1:時刻は考慮してない

9/16(金) デブサミ関西 に SQLWorld として参加します

Developers Summit 2016 KANSAI #devsumi

今年で 6回目の Devepolers Summit KANSAI ですが、今回も SQLWorld として参加させていただくことになりました。

今回のデブサミ関西も面白そうな話しがたくさん聞けそうです。
平日開催ですが、ご都合がよければ是非ご参加を~。

今年のコミュニティ LT は懇親会であるそうですので、本編だけでなく懇親会も宜しくお願いします!

SQL Server / SQL Database にクエリを実行する Web アプリのコードを Github で公開しました

SqlWorld :: ホーム のハンズオンで使ってる Webアプリ(TSQL Runner) のコードから一部抜粋・改変して、公開してみました。

TSQLRunnerWeb/TSQLRunnerWeb at master · OdaShinsuke/TSQLRunnerWeb · GitHub

テーブルと列表示する Explorer が未実装だったり、複数の select 書いても最初の select の結果しか表示されなかったりとかしてます。
Explorer は早い目に実装しときます。

8/23(火) SQLWorld★大阪#38 開催します

2週間前の告知! SqlWorld :: SQLWorld★大阪#38 開催します。20回目の平日夜開催で、前回同様 ハンズオン 形式行う予定です。

【日時】
2016年8月23日(火曜日) 19:00~21:00
 

【イベント概要】
SQLWorld 20回目の平日夜開催~。今回も、みんなで SQL を書いてみようというハンズオン企画です!ブラウザがあれば参加出来るようにしていますので、iPad 等のタブレットでも大丈夫です。
 

【会場】
フェンリル株式会社さま大阪本社 http://www.fenrir-inc.com/
〒530-0011 大阪府大阪市北区大深町 3番1号 グランフロント大阪タワーB(オフィス) 14F
http://info.fenrir-inc.com/jp/profile/overview.html
 

【参加費】
無料
 

【持ち物】
パソコン/タブレット (DB のインストールは不要です。)
 

【参加可能人数】
13 人
 

お題に沿って、SQL を書いてみようという勉強会です。是非ご参加を~。

開催回数は増えていっていますが、続き物というわけでは無いので初めて参加される方でもお気軽にどぞー。

JDBC Driver 6.0 for SQL Server のシステム要件が修正されてました!

Download Microsoft JDBC Driver 6.0 for SQL Server、Microsoft JDBC Driver 4.2 for SQL Server、Microsoft JDBC Driver 4.1 for SQL Server、および Microsoft JDBC Driver 4.0 for SQL Server from Official Microsoft Download Center
ダウンロードページのシステム要件が修正されてました。

これで間違えて sqljdbc42.jar を Java7 で使う事は無くなるんじゃないですかね~。

SQL Server 2016 Express の機能サポートメモ

SQL Server のサンプルデータベース - お だ のスペース
で2016のサンプルDBの紹介をしたので、Standard と比べて Express だと新機能がどこまで動くのかドキュメント調べてみました。*1

Features Supported by the Editions of SQL Server 2016

Standard と比べると、毎度のことながら、HA / セキュリティの部分で劣っています。
2016 新機能でいえば、以下が Standard では使えるけど Express では動かない機能です。

  • Standard で Always On が一部サポートされたので、その部分
  • 行レベルセキュリティ
  • 動的データマスキング
  • Basic R integration
  • Polybase compute node

Always On や R、Polybase は、Express では使わないでしょうし問題無いかな。
動的データマスキング は、Express でも使いたいケースがあるかもしれませんが、アプリコード側で何とかしてくださいって感じ。
行レベルセキュリティ は、Express でマルチテナントとかしないでしょうし大丈夫かな?

逆に JSON、Query Store、Temporal Table、Stretch Database は、Express でも使えます。
Stretch Database 使えるので、データサイズ の上限(10GB)を超えて格納とか出来そうな気がします。*2

早く MSDNSQL Server 2016 日本語ドキュメント出てほしいなぁ~。

*1:動かしたわけでは無い!

*2:するかどうか知りませんが

SQL Server のサンプルデータベース

Twitter で DB のサンプルスキーマーやデータ無いかなみたいなのを見かけたので。

2016 の サンプル
sql-server-samples/samples/databases/wide-world-importers at master · Microsoft/sql-server-samples · GitHub

2014以前のサンプル
Microsoft SQL Server Product Samples: Database - Home

SQL Server のサンプルといえば Adventure Works でしたが、Wide World Importers が追加された感じです。
Wide World Importers で 2016 のどんな機能が使われているかは、SE の雑記でどうぞ。
SQL Server の新しいサンプルデータベースである WideWorldImporters で使用されている SQL Server の機能を確認してみる at SE の雑記