かばだんなさん かく語りぬ Header Image

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で動作確認しました。


コメントを残す