sql >> Databáze >  >> RDS >> PostgreSQL

strftime v sqlite převést na postgres

Tento SQLite:

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

Je, AFAIK, odečtením počtu dní v týdnu (tj. 0 pro neděli, 1 pro pondělí, ...) od date a poté převést výsledek zpět na date; viz referenční informace o funkci data pro podrobnosti.

Myslím, že ekvivalent pro PostgreSQL by byl:

d - extract(dow from d)::int

kde d je vaše datum; odečtením celého čísla od data se tento počet dní odečte. Pokud d je časové razítko, pak možná budete muset přidat nějaké casting. Existuje date_trunc('week', 'd') také, ale to začíná počítat dny od pondělí, takže s tím budete mít o jednu volno.

Zde je rychlý rozpis SQLite s date proměnná nahrazena d aby nedošlo k záměně s date() funkce:

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

Nejprve || je standardní operátor zřetězení řetězců SQL. strftime funkce je obecný formátovač data a času, který pochází z POSIX ; %w specifikátor formátu znamená "den v týdnu jako číslo, přičemž neděle je den nula"; tedy strftime call vám dá 0 pro neděli, 1 pro pondělí a tak dále až do 6 pro sobotu. Pokud d je úterý, pak strftime call dá 2 a celá věc skončí jako:

date(d, '-2 days')

Modifikátory pro SQLite date funkce mají různé tvary, ale '-2 days' znamená přesně to, co si myslíte:odečtěte dva dny od d . Celkový výsledek je, že dostanete d zkráceno na týden (kde neděle je považována za první den v týdnu).

Na straně PostgreSQL:

d - extract(dow from d)::int

můžeme začít s extract ; extract se používá k extrahování určitých částí data nebo času a dow znamená "den v týdnu jako číslo, přičemž neděle je den nula". Zní povědomě? Poté ::int přetypuje číslo DOW na celé číslo a je potřeba, protože DOW ve skutečnosti vychází jako hodnota s dvojnásobnou přesností a není definován žádný operátor pro odečítání dvojnásobku od data v PostgreSQL; cast lze také zapsat ve standardním tvaru jako cast(x as int) . Když odečtete celé číslo od data v PostgreSQL, odečtete tolik dní; můžete být jasnější, když řeknete věci jako - interval '3 days' ale to by v tomto případě jen přidalo více hluku, takže jsem se rozhodl pro jednoduchost. Pokud je úterý, naše verze PostgreSQL vypadá takto:

d - 2

a to je stejné jako:

d - interval '2 days'

A po odečtení bychom se vrátili v neděli. Je zde také date_trunc v PostgreSQL, ale to by se zkrátilo na pondělí, nikoli na neděli.



  1. Výjimka nasazení Weblogic:PaddingException:Nelze provést zrušení odsazení:neplatný bajt vyplnění

  2. MySQL dump .sql skript a import do Apache derby

  3. Ruby:mysql2-Gem nefunguje (Mac OS X Snow Leopard, Ruby 1.9.2)

  4. Objednejte dotaz Oracle podle SUM bez výběru SUM