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.