MSSQL – CASE WHEN sa više opcija
SELECT CASE WHEN boja=0 THEN 'plavo' WHEN boja=1 THEN 'zeleno' WHEN boja=2 THEN 'crno' WHEN boja=3 THEN 'bijelo' ELSE 'nepoznato' END
SELECT CASE WHEN boja=0 THEN 'plavo' WHEN boja=1 THEN 'zeleno' WHEN boja=2 THEN 'crno' WHEN boja=3 THEN 'bijelo' ELSE 'nepoznato' END
Problem - “SELECT case when B is null then A else B end” javlja grešku “Conversion failed when converting the nvarchar value” ako je datatype A i B različit
Ako je A broj, a B varchar treba pretvoriti broj u varchar
SELECT case when CAST(B AS NVARCHAR(MAX)) is null then A else CAST(B AS NVARCHAR(MAX)) end
Sada su A i B nvarchar i može se odraditi CASE WHEN…
Problem: Selektirati sutrašnji datum
Rješenje:
SELECT DATEADD(dd, 1, GETDATE())
http://stackoverflow.com/questions/167491/sql-server-2005-using-dateadd-to-add-a-day-to-a-date
Problem: kako ispisati različite formate datuma iz dateTime polja?
Datum = 2014-09-14 13:52:24
Samo godina iz datuma:
SELECT YEAR(datum)
= 2014
———————————
Samo mjesec iz datuma:
SELECT MONTH(datum)
= 9
———————————
Samo datum bez preciziranja vremena:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, datum))
SELECT CAST(FLOOR( CAST( datum AS FLOAT ) ) AS DATETIME)
= 2014-09-14 00:00:00
———————————
Samo datum formatiran kao YYYY-MM-DD :
SELECT CONVERT(VARCHAR(10), dateStart, 120)
= 2014-09-14
———————————
Samo datum formatiran kao DD.MM.YYY:
SELECT CONVERT(VARCHAR(10), datum, 104)
= 14.09.2014
———————————
Samo vrijeme:
SELECT CONVERT(VARCHAR(8), datum, 8 )
= 13:52:24
———————————
Dan u tjednu brojčano s time da je 1=nedjelja:
SELECT DATEPART(weekday,datum)
= 1
SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
http://systasis.biz/blog/?p=138
http://systasis.biz/blog/?p=301
Problem:
Želimo selektirati iz baze vrijednost nekog polja “bit” (dakle, true/false) upotrebom GROUP BY, ali ne želimo grupirati po njemu.
Rješenje:
Pretvoriti bit u int.
SELECT MIN(CAST(aktivno AS INT)) AS aktivno FROM tbl_tablica GROUP BY id
Problem:
Želimo selektirati iz tablice (ili je updejtati) gdje polje tipa ntext = nešto…
npr:
UPDATE tbl_tablica SET sadrzaj=null WHERE sadrzaj ='abc'
Ako nam je polje sadrzaj tipa ntext tada nasteje greška: “The data types text and varchar are incompatible in the equal to operator”
Rješenje:
Polje ntext moramo pretvoriti u varchar unutar query-a:
UPDATE tbl_tablica SET sadrzaj=null WHERE CAST(sadrzaj AS nvarchar(max)) ='abc'
Problem:
zanima nas samo datum iz datetime polja kako bi ga usporedili sa nekim datumom:
Rješenje:
SELECT * FROM tablica WHERE CONVERT(VARCHAR(10), mojDatum, 120)<='2014-04-01'
Međutim, ako datum napišemo kao 2014-4-1 ovo neće biti dobro jer se usporedba radi kao varchar, a ne date…
zato možemo:
SELECT * FROM tablica WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, mojDatum)) <= '2014-4-1'
ovo također igra… drugačiji oblik datuma za usporedbu..
SELECT * FROM tablica WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, mojDatum)) <= '2014-04-01'
http://systasis.biz/blog/?p=138
Problem: kako zamijeniti schemu svim objektima u bazi?
Rješenje:
http://stackoverflow.com/questions/17571233/how-to-change-schema-of-all-tables-views-and-stored-procedures-in-mssql
SELECT 'ALTER SCHEMA NewSchemaName TRANSFER ' + SysSchemas.Name + '.' + DbObjects.Name + ';'
FROM sys.Objects DbObjects
INNER JOIN sys.Schemas SysSchemas ON DbObjects.schema_id = SysSchemas.schema_id
WHERE SysSchemas.Name = 'OldSchemaName'
AND (DbObjects.Type IN ('U', 'P', 'V'))
Problem: u tablici (polja id i naziv) imamo 10 imena… nas zanimaju imena od 6-tog reda nadalje
Pero, Mirko, Ana, Mate, Boris, Zoran, Ivana, Željko, Miro, Ivica
Rješenje:
SELECT * FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY id ASC) AS rownumber,
ime
FROM tbl_imena
) AS dtbl_privremena
WHERE rownumber >= 7
rezultat:
Ivana, Željko, Miro, Ivica
Problem: Kako saznati da li se dva raspona datuma preklapaju?
raspon1 = 20.02.2013 – 01.03.2013
raspon2 = 15.01.2013 – 22.02.2013
Rješenje:
(Start1 <= End2) AND (Start2 <= End1)
tj.
(20.02.2013<= 22.02.2013) AND (15.01.2013 <= 01.03.2013)
… da li se preklapaju i u početnim i završnim točkama
(Start1 < End2) AND (Start2 < End1)
… da li se preklapaju ne računajući početne i završne točke