Este SQLite:
date(date, '-' || strftime('%w', date) || ' days')
É, AFAIK, subtraindo o número de dias do dia da semana (ou seja, 0 para domingo, 1 para segunda-feira, ...) de
date
e, em seguida, convertendo o resultado de volta para uma data
; consulte a referência da função de data
para detalhes. Eu acho que o equivalente para o PostgreSQL seria:
d - extract(dow from d)::int
onde
d
é a sua data; subtrair um número inteiro de uma data subtrai esse número de dias. Se d
é um carimbo de data/hora, talvez seja necessário adicionar alguma transmissão. Há date_trunc('week ', 'd')
também, mas isso começa a contar os dias a partir de segunda-feira, então você estaria fora por um com isso. Aqui está um rápido detalhamento do SQLite com a
data
variável substituída por d
para evitar confusão com o date()
função:date(d, '-' || strftime('%w', d) || ' days')
Em primeiro lugar,
||
é o operador de concatenação de cadeia de caracteres SQL padrão. O strftime
função
é um formatador de data e hora de uso geral que vem de POSIX
; o %w
especificador de formato significa "dia da semana como um número com domingo sendo o dia zero"; então o strftime
A chamada dá-lhe 0 para domingo, 1 para segunda-feira e assim sucessivamente até 6 para sábado. Se d
é uma terça-feira, então o strftime
call renderá 2 e a coisa toda termina como:date(d, '-2 days')
Os modificadores para o SQLite
date
função
tem vários formulários, mas '-2 dias'
significa exatamente o que você pensa:subtrair dois dias de d
. O resultado geral é que você obtém d
truncado para a semana (onde domingo é considerado o primeiro dia da semana). Do lado do PostgreSQL:
d - extract(dow from d)::int
podemos começar com
extrair
; extrair
é usado para extrair partes específicas de uma data ou hora e dow
significa "dia da semana como um número com domingo sendo o dia zero". Soa familiar? Então o ::int
converte o número DOW em um inteiro e é necessário porque o DOW realmente sai como um valor de precisão dupla e não há operador definido para subtrair um duplo de uma data no PostgreSQL; o cast também pode ser escrito na forma padrão como cast(x as int)
. Ao subtrair um número inteiro de uma data no PostgreSQL, você subtrai esse número de dias; você pode ser mais explícito dizendo coisas como - intervalo '3 dias'
mas isso apenas adicionaria mais ruído nesse caso, então optei pela simplicidade. Se for terça-feira, nossa versão do PostgreSQL se parece com:d - 2
e é o mesmo que:
d - interval '2 days'
E depois da subtração voltaríamos no domingo. Há também
date_trunc
no PostgreSQL, mas isso seria truncado para segunda-feira e não para domingo.