PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

strftime dans sqlite convertir en postgres

Ce SQLite :

date(date, '-' || strftime('%w', date) || ' days')

Est, autant que je sache, en soustrayant le nombre de jours de la semaine (c'est-à-dire 0 pour dimanche, 1 pour lundi, ...) de date puis reconvertir le résultat en une date; voir la référence de la fonction date pour plus de détails.

Je pense que l'équivalent pour PostgreSQL serait :

d - extract(dow from d)::int

d est votre rendez-vous; soustraire un entier d'une date soustrait ce nombre de jours. Si d est un horodatage, vous devrez peut-être ajouter un casting. Il y a date_trunc('week', 'd') aussi, mais cela commence à compter les jours à partir de lundi, donc vous serez en retard d'un avec ça.

Voici une ventilation rapide du SQLite avec la date variable remplacée par d pour éviter toute confusion avec le date() fonction :

date(d, '-' || strftime('%w', d) || ' days')

Tout d'abord, || est l'opérateur de concaténation de chaînes SQL standard. Le strftime fonction est un formateur de date et d'heure à usage général qui provient de POSIX ; le %w le spécificateur de format signifie "le jour de la semaine sous la forme d'un nombre, dimanche étant le jour zéro" ; donc le strftime call vous donne 0 pour dimanche, 1 pour lundi, et ainsi de suite jusqu'à 6 pour samedi. Si d est un mardi, puis le strftime call donnera 2 et le tout se terminera par :

date(d, '-2 days')

Les modificateurs pour la SQLite date fonction avoir différentes formes mais '-2 days' signifie exactement ce que vous pensez :soustrayez deux jours de d . Le résultat global est que vous obtenez d tronqué à la semaine (où le dimanche est considéré comme le premier jour de la semaine).

Côté PostgreSQL :

d - extract(dow from d)::int

nous pouvons commencer par extract ; extract est utilisé pour extraire des parties spécifiques d'une date ou d'une heure et dow signifie "jour de la semaine sous forme de nombre, dimanche étant le jour zéro". Semble familier? Puis le ::int convertit le nombre DOW en un entier et est nécessaire car le DOW sort en fait comme une valeur à double précision et il n'y a pas d'opérateur défini pour soustraire un double d'une date dans PostgreSQL ; le cast peut aussi être écrit sous la forme standard comme cast(x as int) . Lorsque vous soustrayez un entier d'une date dans PostgreSQL, vous soustrayez ce nombre de jours ; vous pouvez être plus explicite en disant des choses comme - interval '3 days' mais cela ne ferait qu'ajouter plus de bruit dans ce cas, j'ai donc opté pour la simplicité. Si c'est mardi, alors notre version PostgreSQL ressemble à :

d - 2

et c'est la même chose que :

d - interval '2 days'

Et après la soustraction, nous serions de retour dimanche. Il y a aussi date_trunc dans PostgreSQL mais cela tronquerait au lundi et non au dimanche.