SQLServer・SQLAzureでNOW()
MySQLで開発をしていて一番使う関数は実は NOW() じゃないかと思っています。
レコードの末尾に「登録日時」・「更新日時」なんて項目をもつテーブルはよくあります。このレコードを登録する際に、
INSERT INTO ….. , NOW(), null
てな感じで、DBの現在時刻を放り込むパターンです。
(もちろんアプリでアプリケーションサーバの時刻を取得してセットしても良いのですが、アプリの実装漏れで値がセットされなかったり、APサーバが複数台構成になった時に時間がバラバラになったり・・・まぁセオリーとしてDBの時間で統一するのが無難でしょう。)
SQLServerの場合は「GETDATE()」や「SYSDATETIME()」で取得しますが、これが Azure環境では日本時間を取得できないんです。(そりゃそうだ。クラウド環境だからね。)
そんなわけでクラウド環境でも使えるように日本時間の現在時刻取得関数をユーザー定義関数として作りました。
-- if already, drop function IF OBJECT_ID(N'[NOW]') IS NOT NULL DROP FUNCTION [NOW]; GO -- ============================================= -- Author: ShallSystemService Kaba -- Create date: 2011/11/15 -- Description: NOW() function for SQL Azure -- Call me in SQL, ex "select dbo.now()" -- ============================================= CREATE FUNCTION [NOW] () RETURNS datetime2 AS BEGIN DECLARE @Result datetime2 -- MachineDate cast to UTC+9 SELECT @Result = DATEADD(hour, 9, SYSUTCDATETIME()) RETURN @Result END GO
使い方は上記の例ですと
INSERT INTO ….. , dbo.NOW(), null
で現在日時をセットしてくれます。ちなみに戻り値はdatetime2 形式なので、マイクロ秒まで取ります。(23:59:59.000000)
もし使えるようなら使ってください。Authorクレジットを消さなければ無償でいいですよ、これぐらい。
※ ローカルテスト用にもちろんSQLServerでも使えます。SQLServer2008R2で動作確認しました。
