ラベル Date/日付 の投稿を表示しています。 すべての投稿を表示
ラベル Date/日付 の投稿を表示しています。 すべての投稿を表示

2011/03/08

日付の書式とタイムゾーン (Timezone)

BI Publisher で日付型を出力する際には、タイムゾーンの注意が必要です。
今回は時刻部分をtruncした日付をテンプレートで書式設定すると、日付に誤差が生じる例を説明します。

データソースに以下のSQLを設定します。
select sysdate as col_sysdate,
       trunc(sysdate) as col_sysdate_trunc
 from dual


このデータソースから得られる実データは以下の様になります。
<DATA_DS>
<G_1>
  <COL_SYSDATE>2011-03-07T21:31:59.000+09:00</COL_SYSDATE> 
  <COL_SYSDATE_TRUNC>2011-03-07T00:00:00.000+09:00</COL_SYSDATE_TRUNC>
</G_1>
</DATA_DS>


これらのデータをテンプレート上でyyyy/MM/ddに書式設定してプレビュー表示します。



col_sysdate_truncの値が1日ずれます。



これはレポートタイムゾーンがデフォルトでUTCと認識されるために発生します。表示形式をyyyy/MM/dd  hh:mm:ssに設定した実行結果を以下に示します。実際には、タイムゾーンの時差、9時間前の値として認識されていることが確認できます。



参考URLでは「RTFテンプレートでの日付書式設定は使用しないこと」という身も蓋もない回避策と、format-dateにてタイムゾーンを設定する方法が紹介されています。format-dateの書式は以下の通りです。なお、format-dateにおけるタイムゾーンはJavaタイムゾーン書式ですが、日付書式はオラクル書式ですので注意してください。
<?format-date:HIREDATE;'yyyy-mm-dd';'Asia/Tokyo'?>

参考URL:
http://blogs.oracle.com/xmlpublisher/2009/06/how_to_keep_your_dates_from_go.html



[ Summary ]
Date value in BI Publisher is Timezone sensitive.  With format-date, you can settle the date value in certain timezone.  Note that while the timezone parameter is based on Java formula, date format parameter is based on Oracle formula.
For more details, refer the URL above.

2011/03/02

日付の計算 (Adding days to a date)

日付に加算・減算を行うには xdoxslt:ora_format_date_offset を使用します。書式は以下の通りです。
<?xdoxslt:ora_format_date_offset(date, offset, 'operator')?>

前日の日付を表示する場合は以下のように offset に1、operator にマイナス記号を設定します。
<?xdoxslt:ora_format_date_offset(HIREDATE, 1, '-')?>


また、参考URLで紹介されているように、offset に列名を指定することもできます。以下の例では INVOICE_DATE の INVOICE_TERM 日後の日付が取得できます。
<?xdoxslt:ora_format_date_offset(INVOICE_DATE, INVOICE_TERMS, '+')?>


参考URL:



[ Summary ]
xdoxslt:ora_format_date_offset provides date value addition and subtraction.  See the formula above.


Refer the URL above for more details.

2011/02/24

曜日の算出 (Determine day of the week)

BI Publisherでは、テンプレート上で曜日を算出する関数(Excelのweekday関数のようなもの)は提供されていません。
データソース側での対応(曜日データの追加)が可能であればすぐに解決しますが、外部連携ファイルなど、仕様変更の難しいケースではロジックを手組みする必要があります。参考まで、サンプルを作成しました。
※例では'1905-01-01'を基準日としています。これは扱うデータがすべて1905年以降のデータであるという前提の定義です。基準日は、扱うデータよりも前の日付で、日曜日であれば同じ結果が得られます。

サンプルソースは以下の通りです。
2011-02-20 (SUN): <?xdoxslt:date_diff('d', '1905-01-01', '2011-02-20', $_XDOLOCALE, $_XDOTIMEZONE) mod 7?>
2011-02-21 (MON): <?xdoxslt:date_diff('d', '1905-01-01', '2011-02-21', $_XDOLOCALE, $_XDOTIMEZONE) mod 7?>
...
2011-02-26 (SAT): <?xdoxslt:date_diff('d', '1905-01-01', '2011-02-26', $_XDOLOCALE, $_XDOTIMEZONE) mod 7?>



実行結果は以下の通りです。曜日を1(日曜日)~7(土曜日)の値で取得できます。




以下の例では、PROC_DATEが月曜日の場合にメッセージを表示します。
<?if:(xdoxslt:date_diff('d', '1905-01-01', PROC_DATE, $_XDOLOCALE, $_XDOTIMEZONE) mod 7)=1?>
  今日は月曜日です。- Today is Monday.
<?end if?>


サンプルを作成してみたものの、日付に関わるロジックはやはりデータソース側で対応する方が効率がよいかもしれません。


[ Summary ]
As far as I checked, BI Publisher does not provide date functions to determine day of the week so far (Excel "weekday()" function like).
The example shows how to get the index (0 to 6).
The value '1905-01-01' is static.  This value should be Sunday, and it have to be earlier than the data that you manage.


I suppose this kind of logic should be handled in data source (program) side...





更新履歴

・2011-03-01: タイトルを修正



2011/02/03

日付型パラメータのデフォルト値 その2 (Date function, part 2)

BI Publisher の日付型パラメータに設定する関数の続きです。
前回のSYSDATEの他、 以下の関数が定義されています。
  • FIRST_DAY_OF_MONTH() →当月の初日(1日)
  • LAST_DAY_OF_MONTH() →当月の末日
  • FIRST_DAY_OF_YEAR() →当年の初日(1月1日)
  • LAST_DAY_OF_YEAR() →当年の末日(12月31日)
「前月の末日」を指定する場合は以下の用に指定します。
{$FIRST_DAY_OF_MONTH() - 1$}

残念ながら、一般的な月次バッチで有用となる「前月の初日」を指定する方法は今のところ無いようです(以下の元ネタURL参照)。このあたり、製品仕様の詰めが甘いです。

前月初日~末日でのデータ処理を行う場合には、パラメータで「FIRST_DAY_OF_MONTH()-1」のみを受け渡し、レポートのSQLで当該パラメータを trunc({パラメータ}, 'MONTH')することで対応するのが現状での解となりそうです。


 元ネタ:
http://forums.oracle.com/forums/thread.jspa?threadID=1086737

マニュアル(新機能ガイド)はこちら:
http://download.oracle.com/docs/cd/E17159_01/doc/bi.1013/b54796/toc.htm#BABGDEAC




[ Summary ]
Not only SYSDATE, BIP provides several date functions such as FIRST_DAY_OF_MONTH.
Unfortunately, there are no FIRST_DAY_OF_PREVIOUS_MONTH so far.

Workaround: use "FIRST_DAY_OF_MONTH()-1" (the last day of previous month), and somehow get "trunc({parameter}, 'MONTH')" in the report/batch side.

2011/02/02

日付型パラメータにデフォルト値としてSYSDATEを設定する

Publisherで日付型のパラメータを作成する際、当日の日付を動的にデフォルト値に指定したいことがあります。この場合には、パラメータ設定の「デフォルト値」に
{$SYSDATE()$}
を設定することで実現できます。

レポートをスケジュール実行する場合には、
{$SYSDATE() - 1$}
のような指定が可能です。








[ Summary ]
You can use "SYSDATE" in date parameter field. Addition and subtraction operators are supported. See the figure and formula above.