Ten SQLite:
date(date, '-' || strftime('%w', date) || ' days')
Czy, AFAIK, odjęcie liczby dni w tygodniu (tj. 0 dla niedzieli, 1 dla poniedziałku, ...) od data
a następnie przekonwertować wynik z powrotem na datę
; zobacz odniesienie do funkcji daty
po szczegóły.
Myślę, że odpowiednikiem PostgreSQL byłoby:
d - extract(dow from d)::int
gdzie d
jest twoja randka; odjęcie liczby całkowitej od daty odejmuje tę liczbę dni. Jeśli d
to sygnatura czasowa, może być konieczne dodanie rzutowania. Istnieje date_trunc('week ', 'd')
również, ale to zaczyna się numerować dni od poniedziałku, więc z tym wypadniesz o jeden.
Oto szybki podział SQLite z datą
zmienna zastąpiona przez d
aby uniknąć pomyłek z date()
funkcja:
date(d, '-' || strftime('%w', d) || ' days')
Przede wszystkim ||
jest standardowym operatorem konkatenacji ciągów SQL. strftime
funkcja
to uniwersalny program do formatowania daty i czasu, który pochodzi z POSIX
; %w
specyfikator formatu oznacza „dzień tygodnia jako liczbę, przy czym niedziela jest dniem zerowym”; więc strftime
call daje 0 dla niedzieli, 1 dla poniedziałku i tak dalej aż do 6 dla soboty. Jeśli d
jest wtorek, to strftime
wywołanie da 2, a całość zakończy się tak:
date(d, '-2 days')
Modyfikatory dla SQLite data
funkcja
mają różne formy, ale '-2 dni'
oznacza dokładnie to, co myślisz:odejmij dwa dni od d
. Ogólny wynik jest taki, że otrzymujesz d
obcięte do tygodnia (gdzie niedziela jest uważana za pierwszy dzień tygodnia).
Po stronie PostgreSQL:
d - extract(dow from d)::int
możemy zacząć od extract
; wyodrębnij
służy do wyodrębniania określonych części daty lub czasu oraz dow
oznacza „dzień tygodnia jako liczbę, przy czym niedziela jest dniem zerowym”. Brzmi znajomo? Następnie ::int
rzutuje liczbę DOW na liczbę całkowitą i jest to potrzebne, ponieważ DOW faktycznie jest wartością podwójnej precyzji i nie ma zdefiniowanego operatora do odejmowania liczby podwójnej od daty w PostgreSQL; rzut można również zapisać w standardowej formie jako cast(x as int)
. Odejmując liczbę całkowitą od daty w PostgreSQL, odejmujesz tę liczbę dni; możesz być bardziej precyzyjny, mówiąc rzeczy takie jak - interwał '3 dni'
ale to tylko dodałoby więcej hałasu w tym przypadku, więc zdecydowałem się na prostotę. Jeśli jest wtorek, nasza wersja PostgreSQL wygląda tak:
d - 2
i to to samo, co:
d - interval '2 days'
A po odjęciu wrócilibyśmy w niedzielę. Jest też date_trunc
w PostgreSQL, ale skróciłoby się to do poniedziałku, a nie niedzieli.