Autor Téma: Rozdiel hodnôt vrátených výrazmi CASE  (Přečteno 571 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2786
  • Karma: 26
    • Verze Delphi: XE7 professional
Rozdiel hodnôt vrátených výrazmi CASE
« kdy: 03-01-2017, 12:32:37 »

Potrebujem zrealizovať rozdiel dátumov v rámci jedného roka. Okrajové podmienky riešim pomocou CASE.
Kód: [Vybrat]
SELECT
  CASE
  WHEN (PERSONS.DATEFROM < '01.01.2016') THEN '01.01.2016'
  ELSE PERSONS.DATEFROM
  END AS FROMDATE,
  CASE
  WHEN (PERSONS.DATETO IS NULL) THEN '31.12.2016'
  ELSE PERSONS.DATETO
  END AS TODATE,
  TODATE - FROMDATE AS DAYS
FROM
  PERSONS
Rád by som to mal v jednom kroku (SQL), ale
  • CASE1 - CASE2 -> nie je podporované
  • TODATE - FROMDATE -> stĺpce sú neznáme
Dá sa to bez subselect-u?
« Poslední změna: 03-01-2017, 12:55:29 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Plnoletý
  • ***
  • Příspěvků: 237
  • Karma: 2
    • Verze Delphi: 10.2
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #1 kdy: 03-01-2017, 12:37:49 »
Firebird umí MaxValue / MinValue / Coalesce, ty by šly použít místo podmínek.
Odkazovat se na ty vypočítané sloupce takhle nejspíš nejde, muselo by to být něco ve stylu:

Kód: [Vybrat]
SELECT
 a.FromDate,
 a.ToDate,
 a.ToDate-a.FromDate as Days
FROM
(
SELECT .......
) a

A nebo do toho odčítání zase dát celý výpočet použitý pro ta jednotlivá políčka, což by při použití MaxValue a Coalesce nebylo tak hrozné.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2786
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #2 kdy: 03-01-2017, 13:08:20 »
Hm, neviem ako by mi pomohli MaxValue a MinValue. Za COALESCE ďakujem. Ostanem pri tom subselect-e Východzia tabuľka vyzerá takto:
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Plnoletý
  • ***
  • Příspěvků: 237
  • Karma: 2
    • Verze Delphi: 10.2
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #3 kdy: 03-01-2017, 13:13:05 »
Místo:
Kód: [Vybrat]
CASE
  WHEN (PERSONS.DATEFROM < '01.01.2016') THEN '01.01.2016'
  ELSE PERSONS.DATEFROM
  END AS FROMDATE,
stačí napsat:

Kód: [Vybrat]
MaxValue(PERSONS.DATEFROM, '01.01.2016') as FromDate

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2786
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #4 kdy: 03-01-2017, 14:22:04 »
Výborne, ide to. Len tam ešte musí byť pretypovanie
Kód: [Vybrat]
SELECT
  PERSONS.IDPERSONS,
  PERSONS.PERSONS,
  COALESCE(PERSONS.DATETO, CAST('31.12.2016' AS DATE)) -
  MAXVALUE(PERSONS.DATEFROM, CAST('01.01.2016' AS DATE)) AS DAYS
FROM
  PERSONS
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Plnoletý
  • ***
  • Příspěvků: 237
  • Karma: 2
    • Verze Delphi: 10.2
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #5 kdy: 03-01-2017, 14:35:51 »
A jo, on to opravdu jinak vezme jako text.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2786
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #6 kdy: 03-01-2017, 14:43:03 »
Citace
A jo, on to opravdu jinak vezme jako text.
Veď to so mnou zacvičilo :D  A nie je MAXVALUE() ako Max(). Ja som si to neuvedomil a poplietol. MAXVALUE Císař neuvádza. Takže je to v samostatnej dll.
« Poslední změna: 03-01-2017, 14:47:08 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2786
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #7 kdy: 03-01-2017, 14:50:22 »
Jaj, on pozná len verziu 1.5.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline xhenryx

  • Nováček
  • *
  • Příspěvků: 4
  • Karma: 0
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #8 kdy: 03-01-2017, 15:04:24 »
Samozrejme funguje i case - case

verze 01:
Kód: [Vybrat]
SELECT
  CASE
  WHEN cast('2016-01-01' as date) < cast('2016-01-01' as date) THEN cast('2016-01-01' as date)
  ELSE cast('2017-01-01' as date)
  END  -

  CASE
  WHEN null is null THEN cast('2016-12-31' as date)
  ELSE cast('2015-01-01' as date)
  END

from VERSION

verze 02
Kód: [Vybrat]
select g.fromdate,g.todate,g.fromdate-g.todate
from
(
SELECT
  CASE
  WHEN cast('2016-01-01' as date) < cast('2016-01-01' as date) THEN cast('2016-01-01' as date)
  ELSE cast('2017-01-01' as date)
  END  as fromdate,

  CASE
  WHEN null is null THEN cast('2016-12-31' as date)
  ELSE cast('2015-01-01' as date)
  END as todate
from VERSION
) g


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2786
  • Karma: 26
    • Verze Delphi: XE7 professional
Re:Rozdiel hodnôt vrátených výrazmi CASE
« Odpověď #9 kdy: 03-01-2017, 15:38:42 »
Máš pravdu. Vtedy som ešte bojoval s tým  dátumom. Nerozumel som/zle som pochopil oznam.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: