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.