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.