• ベストアンサー

日付の差を求める関数はないでしょうか。

日付の差を求める関数はないでしょうか。 SQLのDATEDIFFのような単純明快な関数があればいいなぁと思っています。 できれば、Perlの組み込み関数か、標準モジュールで・・・x_x

質問者が選んだベストアンサー

  • ベストアンサー
  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.2

標準モジュールTime::Localに含まれるtimelocal()を使うと、自作サブルーチンで簡単に実現できます。 timelocal()は組み込み関数localtime()の逆関数です。年月日時分秒からエポック秒(1900/01/01 00:00:00 GMTからの秒数)を求めることができます。 use Time::Local; sub date_diff { my($year1, $mon1, $mday1, $year2, $mon2, $mday2) = @_; return((timelocal(0, 0, 0, $mday2, $mon2 - 1, $year2 - 1900) - timelocal(0, 0, 0, $mday1, $mon1 - 1, $year1 - 1900)) / (24 * 60 * 60)); } print date_diff(2000, 1, 1, 2010, 6, 24); # 2000/01/01から2010/06/24までの日数差

zyousuke
質問者

お礼

こんばんは なんと、私はここへ質問に来る前に、Time::Localの説明を読んでいたのでした。 それにも関わらず、私のおつむではサブルーチンをこしらえることが出来ませんでした、とほほ お教えいただいたサブルーチンを、ちこっと改造して、いい感じのサブルーチンが出来ました。 しかし、既に私のスクリプトは、そこそこ軽快に動いているので、このサブルーチンは、次のバージョンアップで入れることにしよう

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

よくわからないけれど、普通にPOSIX:difftimeじゃだめなのですか? POSIX:mktimeとあわせれば出来そうな予感がしますけど

zyousuke
質問者

お礼

こんばんは だめではありません。 知らないだけです^^; mktimeはNo.2 N60-BASICさんが教えてくれたtimelocalほとんど同じ機能ですね! したがってdifftimeは使わずにN60-BASICさんのサブルーチンをmktimeに置き換えるだけで行けますね! しかし今回は、より身近なtimelocalで組もうと思います。 今回というより次回かな・・・^^

全文を見る
すると、全ての回答が全文表示されます。
  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.1

標準ではないですが、CPANモジュールならあります。 Date::Calc

zyousuke
質問者

お礼

こんばんは! やはり標準では、なさそうですね。 でも、無いことが分かってスッキリしました。 さて、悩んだあげく、私がとった方針は・・・ モジュールは入れずに、DBに接続してSQLでDATEDIFFを使うことにしました。 格好悪いですけど・・・

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 日付の差の求め方

    Dim gStr_GrpSDate as String Dim gStr_GrpEDate as String gStr_GrpSDateに 2004/02/01 01:00 gStr_GrpEDateに 2004/02/02 24:00 が入っている場合, Int_DayDiff = DateDiff("d", gStr_GrpSDate, gStr_GrpEDate) のようにDateDiff関数を使用できたら良いのですが (1)型がString (2)gStr_GrpEDateの時刻が24時の為DateDiff関数(Date関数も)が使えない。 等の問題がありうまく処理できません。 このような場合,日付の差を取得するにはどのようにしたら 良いのでしょうか? よろしくお願い致します。

  • Access関数: なぜ日付を指定するとき""で囲むのか?

    Accessの関数でdatediff関数というのがありますが、それを使う時に Datediff("yyyy",,)などと入力しますが、なぜDatediff関数では年、月などの表示形式を""でくくるのでしょうか? ""は文字列を表すのではないのでしょうか? 日付は##で囲まれるのでDatediff(#yyyy#,)ならわかるのですが。 重箱の隅をつつくような質問で申し訳ないのですが、""で囲むことに納得がいきません。 なぜ""で囲むのでしょうか?

  • SQL Sever での日付の差の求め方(月単位小数付き)

    Oracle で日付の差を求める関数に「months_between」 というものがあり、日付A(yyyy-mm-dd)と 日付B(yyyy-mm-dd)の差(A<B の場合)を算出する時は、 select months_between(B ,A) from dual; で算出できます。 しかも、日付差が何ヶ月で返ってきて、月の端数は 小数点以下として返ります。 これを、SQL Server で実現しようとした場合、 どのようにすればよいでしょうか? SQL Server には「datediff」という関数があり、 時間単位を'm'に設定すれば日付差が月で返って きますが、小数点以下が確か切り捨てられたように 記憶しています。 何とかして、小数点以下も算出できる方法を ご存知の方がいらっしゃいましたら、 お教えください。 宜しくお願い致します。 以上

  • 日付に関する関数(エクセル)

     セルの形式が日付のとき「H15.12.16」と表示されるセセルについて、形式を標準にすると「37971」と表示されます。  関数にて、「37971」を「H15.12.16」と変換できると助かるのですが、どうすればいいのか、教えていただけませんか。

  • エクセル日付関数について

     日付関数の初歩的な質問です。  例えばtoday()で、セル書式が日付なら2009/1/4となります。セルの書式を標準にすればシリアル値がでます。そこでyear(today())とし書式が日付なら2009となると思ったのですが、結果は1905/7/1となりました。どういうことなのでしょうか。セル書式を標準にしたら2009となりました。  的はずれの質問かもしれませんが、なぜyear(today())とうつと1905/7/1となるのでしょうか。  

  • エクセルで日付・時刻の差を知りたい

    いつもお世話になってます。 早速質問ですが、エクセルで日付と時刻の差を出す関数や数式を知りたいです。 2つのセルにそれぞれ日付を入力した場合や、時刻をそれぞれ入力した時の差の出し方はわかるのですが、2つのセルにそれぞれ日付・時刻を入力し、その差を出す方法がわかりません。 そもそもそういった方法が可能なのでしょうか。

  • 日付の差を求めるには

    VB6.0で開発しています。 DBに時刻の列名「YEARMONTHDAY」「HOUR」(1~24)がNUMBER型として入っています。 DBより取得した「YEARMONTHDAY」と「HOUR」で日付の差を求めたいのですが, HOURに24の値がきた際,DATE型の範囲以上の為エラーになってしまいます。 なにか日付の差を求める良い方法があればご教授下さい。 (例) Dim pdtm_RecTime As Date Dim str_wk As String '// EOFまでループ Do Until objDynaset.EOF '// 記録日取得 str_wk = Format$(CStr(YEARMONTHDAY.Value) & Format(CStr(HOUR.value), "00") & "00", "0000/00/00 00:00") pdtm_RecTime = CDate(str_wk) ________________________________________________________________________________ 上記のPGだとHOURが24の場合にDateの範囲を超える為エラーになる。 '// 日付差チェック pVar_Diff = DateDiff("h", DateAdd("h", pInt_Hour, gDtm_GrpSDate), pdtm_RecTime) '// データがまだ存在する場合次のレコードに移動 If (objDynaset.EOF = False) Then objDynaset.MoveNext End If pInt_Hour = pInt_Hour + 1 Loop

  • 同機能の、「組み込み関数」と「ユーザ関数」、両者の性能差について。

    いつもお世話になっております。 PHP5.2.5 Apache1.3.37 SQLite3.3.7 PHPには、組み込み関数が予め、膨大な数、用意されているという話なので、 実際には、 有用であるけども出会うことのない組み込み関数 というものもあるように思います。 この場合、 そういった組み込み関数と同機能のユーザ関数 を車輪の再開発してしまうことが考えられます。 そこで、私が知りたいことは、 組み込み関数で提供されている機能を、 ユーザ関数で実現する際、 性能を損なわずに(つまり、処理速度面でも同等に)、 ほぼ等価な関数をユーザ関数で作ることはできるのか、 ということです。 よく使用されるお馴染みの関数の多くは、 それ自体、基本的な機能でのみ構成されていると思われるので、 それをユーザ関数で実現するとなると、 私にも、「それは難しそうだな…」と思えますが、 そうではなく、 かなりマニアックな関数、 つまり、 基本的な組み込み関数を複数組み合わせて作られているような、 そんな組み込み関数も、中にはあるわけで、 それらの中には、よく知られておらず、 車輪の再開発されてしまうものも多いと思います。 (再開発自体を回避する策があるのであれば、それも知りたいと思います) PHPの中の構造について詳しくないので、 既に変なことを言っているかもしれませんし、 以下でも、さらに変なことを言うかもしれませんが、 組み込み関数とは、C言語など、PHPではない言語で作られていたりするのでしょうか? (処理速度をあげる、等の理由から) そうであるならば、 ユーザがPHPを操って作るユーザ関数は、出来る限り作らず、 既存の「組み込み関数」を利用したい、と私は考えます。 よって、「知りたいこと」を要約すると、 ・車輪の再開発を防ぐ方法 ・車輪の再開発されたユーザ関数の、組み込み関数との性能差 ・組み込み関数の成り立ち(C言語由来?) こうなります。 組み込み関数を検索する際の、自分の検索能力を鍛えるべきなのか、 車輪の再開発することになることを想定し、その再開発能力を鍛えるべきなのか、 どなたかに、何らかのアドバイスをして頂けると嬉しく思います。 (そもそも、組み込み関数に適当な関数があるかどうかを、皆さんはどのように検索されているのでしょうね…。 私なんかは、リファレンス本をメインに探していたりしますが。) 以上、どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • Access2000で時間差を求める関数を教えてください

    日数の差を求める関数を知人に  =DATEDIFF() と教わりました。 日数ではなく、経過時間として表示させるにはどのようにしたらいいでしょうか? フォーム上に経過時間が出ればいいと思っておりますが、 加えて、テーブルにデータとして残るようになればなおいいなと考えています。 当方ACCESS2000を使用しており、全くの初心者です。 内容が込み入ってしまう場合、参考できるWEB・書籍のご紹介でも大変助かります。 何卒よろしくお願い致します。

  • VBA:日付をシリアル値にできるの関数教えてください。

    VBAにより、あるセルに"yyyy / mm / dd hh:mm:ss"のフォーマットで日付を記入しました。それを手動で書式を標準にすると例えばシリアル値38148.4768981481になります。これをVBA上でできる関数を知りたいです。つまり、日付をシリアル値にできるVBAの関数を教えて頂きたいです。宜しくお願いいたします。