2

私の質問:スクリプトを使用して、HH:MI:SSの形式で 2 つの日付 (時刻) の差を取得する必要があります。たとえば、2回あった場合:

2012/08/24 13:04:23
2012/08/24 14:15:32

私の結果は次のようになります。

1:11:09

要件: SAP の BusinessObjects Data Services Designer を使用してこれを書いているため、スクリプトは構文規則を満たす必要があります (長い PDF ドキュメントを表示するには、ここをクリックてください... SAP の構文に慣れていない場合は、実際には制限があることを知っておいてください。 ..)。


私が試したこと:SQL現在、ユーザーが探しているものを提供する関数で使用できるSQLステートメントをユーザーに提供する関数(以下を参照)がありますが、このデータストアにとらわれないようにしたいと思います.

これが私の現在の機能です(実際には私が探しているものではありません):

#Use this with a SQL function. For example: SQL('DSS_USER', GetTimeDifferenceSQL($time_1, $time_2));

return '
with seconds as (
  select 24*60*60*(to_date(\'[$time_1]\', \'YYYY.MM.DD hh24:mi:ss\')
                    - to_date(\'[$time_2]\', \'YYYY.MM.DD hh24:mi:ss\')) seconds_diff 
  from dual
)
select to_char(trunc(sum(seconds_diff)/3600), \'FM999999990\')  || \':\' || to_char(trunc(mod(sum(seconds_diff),3600)/60), \'FM00\') || \':\' || to_char(mod(sum(seconds_diff),60), \'FM00\')
from seconds
';

これは、データ ストアから独立して、スクリプトだけで計算されるようにしたいため、機能しません。

また、日付を10進数に変換してからJED_Time(int)関数を使用しようとしましたが、10進数が10を基数とし、時間が基数であることを除いて機能します...したがって、機能しません。


私のホールドアップ:時間には定義されたベースがないという事実に苦労しています....どんな助けでも本当に素晴らしいでしょう! ありがとう!

4

2 に答える 2

1

より簡単な方法は、データ型 Interval を使用することです。

2 つの日時の間の秒を取得するには:

interval_to_char( $dtFrom - $dtTo , 'SS');

間隔を取り、間隔の文字表現を返します。

interval_to_char( [in] InputInterval As interval, [in] FormatString As varchar ) As varchar

この関数は、分と時間を取得するためにも使用できます。

于 2013-04-23T10:40:01.860 に答える
0

これは完全に正確である場合とそうでない場合がありますが、私は理解したと思います。入力は大歓迎です。うまくいけば、これはいつか誰かを助けるでしょう!

#Make sure that when we're finding the difference, we always take the lesser date from the greater date. We'll negate it at the end.
if ($time_1 < $time_2)
begin
  $temp_time = $time_1;
  $time_1 = $time_2;
  $time_2 = $temp_time;
end

#Get all value differences from the two times
$nanoseconds = to_decimal(to_char($time_1, 'FF'), '.', null, 0) - to_decimal(to_char($time_2, 'FF'), '.', null, 0);
$seconds = to_decimal(to_char($time_1, 'SS'), '.', null, 0) - to_decimal(to_char($time_2, 'SS'), '.', null, 0);
$minutes = to_decimal(to_char($time_1, 'MI'), '.', null, 0) - to_decimal(to_char($time_2, 'MI'), '.', null, 0);
$hours = to_decimal(to_char($time_1, 'HH24'), '.', null, 0) - to_decimal(to_char($time_2, 'HH24'), '.', null, 0);
$days = interval_to_char($time_1 - $time_2, 'D');

#fix nanoseconds
if ($nanoseconds >= 1000000000)
begin
  $seconds = $seconds + 1;
  $nanoseconds = $nanoseconds - 1000000000;
end

if ($nanoseconds < 0)
begin
  $seconds = $seconds -1;
  $nanoseconds = $nanoseconds + 1000000000;
end

#fix seconds
if ($seconds >= 60)
begin
  $minutes = $minutes + 1;
  $seconds = $seconds - 60;
end

if ($seconds < 0)
begin
  $minutes = $minutes -1;
  $seconds = $seconds + 60;
end

#fix minutes
if ($minutes >= 60)
begin
  $hours = $hours + 1;
  $minutes = $minutes - 60;
end

if ($minutes < 0)
begin
  $hours = $hours -1;
  $minutes = $minutes + 60;
end

#fix hours
if ($hours >= 24)
begin
  $days = $days + 1;
  $hours = $hours - 24;
end

if ($hours < 0)
begin
  $days = $days - 1;
  $hours = $hours + 24;
end

#fix days
if (trunc($days/365, 0) >= 1)
begin
  $years = trunc($days/365, 0);
  $days = $days - ($years * 365);
end

if (round($days/7, 0) > 0)
begin
  $weeks = round($days/7, 0);
  $days = $days - ($weeks * 7);
end

$ret = '';

if ($years > 0)
begin
  $ret = $years||' year'||ifthenelse($years = 1, '', 's')||' ';
end

if ($weeks > 0)
begin
  $ret = $ret||$weeks||' week'||ifthenelse($weeks = 1, '', 's')||' ';
end

if ($days > 0)
begin
  $ret = $ret||$days||' day'||ifthenelse($days = 1, '', 's')||' ';
end

$ret = $ret||$hours||':'||lpad($minutes, 2, '0')||':'||lpad($seconds, 2, '0')||':'||lpad(round($nanoseconds/1000000, 0), 3, '0');

#Negate it if the parameter values were swapped at the beginning (using $temp_time)
if ($temp_time is not null)
begin
  $ret = '-'||$ret;
end

return $ret;
于 2012-08-20T21:05:23.147 に答える