sql >> Database teknologi >  >> RDS >> PostgreSQL

strftime i sqlite konverter til postgres

Denne SQLite:

date(date, '-' || strftime('%w', date) || ' days')

Er, AFAIK, at trække antallet af dag-i-ugen-dage (dvs. 0 for søndag, 1 for mandag, ...) fra dato og derefter konvertere resultatet tilbage til en dato; se datofunktionsreference for detaljer.

Jeg tror, ​​at ækvivalenten til PostgreSQL ville være:

d - extract(dow from d)::int

hvor d er din date; subtrahering af et heltal fra en dato trækker dette antal dage fra. Hvis d er et tidsstempel, så skal du muligvis tilføje noget casting. Der er date_trunc('uge) ', 'd') også, men det begynder at tælle dagene fra mandag, så du ville være fri af én med det.

Her er en hurtig opdeling af SQLite med dato variabel erstattet af d for at undgå forveksling med date() funktion:

date(d, '-' || strftime('%w', d) || ' days')

Først og fremmest || er standard SQL-strengsammenkædningsoperatoren. strftime funktion er en generel dato- og tidsformater, der kommer fra POSIX ; %w formatangivelse betyder "ugedag som et tal, hvor søndag er dag nul"; så strftime call giver dig 0 for søndag, 1 for mandag, og så videre op til 6 for lørdag. Hvis d er en tirsdag, derefter strftime opkald vil give 2 og det hele ender som:

date(d, '-2 days')

Modifikatorerne for SQLite dato funktion har forskellige former, men '-2 dage' betyder lige, hvad du tror:Træk to dage fra d . Det overordnede resultat er, at du får d afkortet til ugen (hvor søndag anses for at være den første dag i ugen).

På PostgreSQL-siden:

d - extract(dow from d)::int

vi kan starte med uddrag ; uddrag bruges til at udtrække bestemte dele af en dato eller tid og dow betyder "ugedag som et tal, hvor søndag er dag nul". Lyder det bekendt? Derefter ::int kaster DOW-tallet til et heltal og er nødvendigt, fordi DOW'en faktisk kommer ud som en dobbelt præcisionsværdi, og der er ingen operator defineret til at trække en dobbelt fra en dato i PostgreSQL; castet kan også skrives i standardformen som cast(x as int) . Når du trækker et heltal fra en dato i PostgreSQL, trækker du så mange dage; du kan være mere eksplicit ved at sige ting som - interval '3 dage' men det ville bare tilføje mere støj i dette tilfælde, så jeg valgte enkelhed. Hvis det er tirsdag, så ser vores PostgreSQL-version ud som:

d - 2

og det er det samme som:

d - interval '2 days'

Og efter subtraktionen ville vi være tilbage på søndag. Der er også date_trunc i PostgreSQL, men det ville afkortes til mandag ikke søndag.



  1. MYSQL:Hvordan finder man player_id fra efternavnet?

  2. Sådan bruges betinget til denne forespørgsel i Laravel 5.2

  3. Mysql ydeevne på 6 millioner rækker bord

  4. Hent id fra en betinget INSERT