sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:s date_trunc i mySQL

Extraktfunktionen verkar användbar och datumfunktionen jag har hittat löser några av mina problem, men finns det något sätt att replikera PostgreSQL:s date_trunc?

Faktum är att EXTRACT ser ut som att det kommer att vara den närmaste matchen för det här specifika fallet.

Din ursprungliga kod i PG:

WHERE date_trunc('month', QUERY_DATE) BETWEEN 
    date_trunc('month', now()) - INTERVAL '4 MONTH' AND 
    date_trunc('month', now() - INTERVAL '1 WEEK')

Använder EXTRACT :

WHERE EXTRACT(YEAR_MONTH FROM QUERY_DATE)
      BETWEEN
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 4 MONTH)
      AND
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 1 WEEK)

Även om det borde vara funktionellt identiskt, är detta faktiskt att mangla datumen till en ÅÅÅÅMM-sträng innan jämförelsen görs.

Ett annat alternativ skulle vara att använda DATE_FORMAT för att bygga om datumsträngen och tvinga den till början av månaden:

WHERE DATE_FORMAT(QUERY_DATE, '%Y-%m-01')
      BETWEEN
          DATE_FORMAT(NOW() - INTERVAL 4 MONTH, '%Y-%m-01')
      AND
          DATE_FORMAT(NOW() - INTERVAL 1 WEEK, '%Y-%m-01')

Tänk också på att MySQL är riktigt dålig på att hantera datumintervall, även när fältet är indexerat. Du kommer förmodligen att sluta med en genomsökning av hela tabellen om du inte är försiktig.



  1. Vad är skillnaden mellan MyISAM och InnoDB?

  2. Vad är bättre i MYSQL count(*) eller count(1)?

  3. Oracle partitionerat bord

  4. SQL Server 2016 – Introduktion till Stretch Database