sql >> Database >  >> RDS >> Mysql

Het verschil in maanden tussen datums in MySQL

Maandverschil tussen twee gegeven datums:

Het verbaast me dat dit nog niet is genoemd:

Bekijk de TIMESTAMPDIFF() functie in MySQL.

Wat u hiermee kunt doen, is in twee TIMESTAMP . doorgeven of DATETIME waarden (of zelfs DATE zoals MySQL automatisch zal converteren) evenals de tijdseenheid waarop u uw verschil wilt baseren.

U kunt MONTH . specificeren als de eenheid in de eerste parameter:

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

Het krijgt in feite het aantal maanden dat is verstreken vanaf de eerste datum in de parameterlijst. Deze oplossing compenseert automatisch het variërende aantal dagen in elke maand (28,30,31) en houdt ook rekening met schrikkeljaren - u hoeft zich daar geen zorgen over te maken.

Maandverschil met precisie:

Het is een beetje ingewikkelder als je decimale precisie wilt invoeren in het aantal verstreken maanden, maar hier is hoe je het kunt doen:

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
  )

Waar startdate en enddate zijn uw datumparameters, of het nu uit twee datumkolommen in een tabel is of als invoerparameters uit een script:

Voorbeelden:

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. ScaleGrid DigitalOcean-ondersteuning voor MySQL, PostgreSQL en Redis™ nu beschikbaar

  2. VARRAY's maken als databaseobject in Oracle Database?

  3. SCD-type 6

  4. TIMESTAMP() Voorbeelden – MySQL