PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

strftime no sqlite converter para postgres


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.