sql >> データベース >  >> RDS >> Mysql

MySQLの日付間の月の違い

    月-任意の2つの日付の違い:

    これがまだ言及されていないことに驚いています:

    TIMESTAMPDIFF() MySQLで機能します。

    これにより、2つのTIMESTAMPを渡すことができます。 またはDATETIME 値(またはDATE MySQLが自動変換するため)、および差の基礎となる時間の単位。

    MONTHを指定できます 最初のパラメータの単位として:

    SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-04')
    -- Outputs: 0
    
    SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-05')
    -- Outputs: 1
    
    SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-06-15')
    -- Outputs: 1
    
    SELECT TIMESTAMPDIFF(MONTH, '2012-05-05', '2012-12-16')
    -- Outputs: 7
    

    基本的に、パラメータリストの最初の日付から経過した月数を取得します。このソリューションは、うるう年を考慮に入れて、毎月のさまざまな日数(28、30、31)を自動的に補正します。そのようなことについて心配する必要はありません。

    正確な月差:

    経過した月数に小数精度を導入する場合は少し複雑ですが、その方法は次のとおりです。

    SELECT 
      TIMESTAMPDIFF(MONTH, startdate, enddate) +
      DATEDIFF(
        enddate,
        startdate + INTERVAL
          TIMESTAMPDIFF(MONTH, startdate, enddate)
        MONTH
      ) /
      DATEDIFF(
        startdate + INTERVAL
          TIMESTAMPDIFF(MONTH, startdate, enddate) + 1
        MONTH,
        startdate + INTERVAL
          TIMESTAMPDIFF(MONTH, startdate, enddate)
        MONTH
      )
    

    startdate およびenddate テーブル内の2つの日付列からのものか、スクリプトからの入力パラメーターとしてかを問わず、日付パラメーターは次のとおりです。

    例:

    With startdate = '2012-05-05' AND enddate = '2012-05-27':
    -- Outputs: 0.7097
    
    With startdate = '2012-05-05' AND enddate = '2012-06-13':
    -- Outputs: 1.2667
    
    With startdate = '2012-02-27' AND enddate = '2012-06-02':
    -- Outputs: 3.1935
    


    1. MySQLは600K行からランダムな10行を高速で選択します

    2. コマンドラインでMySQLデータベースをインポートする方法

    3. SQLはすべてのNULLを置き換えます

    4. 複数の外部キーを使用してテーブルを作成し、混乱しないようにする方法