2017-11-12 3 views
1

Diese Arbeit:Suche nach Ferien doy IN (string) (Postgresql)

WITH month AS ( 
SELECT date_part('doy',d.dt) as doy, 
dt::date as date 
FROM generate_series('2017-01-01','2017-01-15', interval '1 day') as d(dt) 
) 

SELECT date, 
CASE 
WHEN doy IN (1,2,3) THEN 0 ELSE 8 END 
FROM month 

http://sqlfiddle.com/#!15/aed15/10

Aber wenn ich speichern 1,2,3 als String

CREATE TABLE holidays 
    (id int4,days character(60));  
INSERT INTO holidays 
    (id,days) 
VALUES 
    ('2017','1,2,3'); 

.. .und ersetzen 1,2,3 mit dieser Zeichenkette:

WITH month AS ( 
SELECT date_part('doy',d.dt) as doy, 
dt::date as date 
FROM generate_series('2017-01-01','2017-01-15', interval '1 day') as d(dt) 
) 

SELECT date, days, 
CASE 
WHEN doy::text IN (days) THEN 0 ELSE 8 END 
FROM month 
LEFT JOIN holidays ON id=2017 

http://sqlfiddle.com/#!15/aed15/13

Es scheint, dass "Tage" nicht korrekt ist. Aber ich kann nicht herausfinden, wie.

TIA,

Antwort

1

die kürzeste Lösung wäre hier Stringliste zu Array umdrehen und mit ANY Konstrukt:

WITH month AS ( 
SELECT date_part('doy',d.dt) as doy, 
dt::date as date 
FROM generate_series('2017-01-01','2017-01-15', interval '1 day') as d(dt) 
) 

SELECT date, days, 
CASE 
WHEN doy::text = ANY(concat('{',days,'}')::text[]) THEN 0 ELSE 8 END 
FROM month 
LEFT JOIN holidays ON id=2017 

Aber ich würde die ganze Lösung zu überdenken, da es falsch anfühlt

+0

Ich habe die Feiertage getrennt zu speichern. Was ist dein Vorschlag? – sibert

+0

Ich hätte wahrscheinlich Urlaubstisch mit konkreten Daten. hundert jahre hilidays wäre immer noch eine kleine ausfallstabelle gegen jaoin gegen –

+0

WANN doy = ANY (string_to_array (days, ',') :: integer []) DANN 0 ELSE 8 scheint auch zu funktionieren. Irgendwelche anderen Vorschläge? – sibert