27 lipca Microsoft udostępnił pierwszą aktualizację od wydania w maju wersji próbnej SQL Server 2022.
CTP 2.1 zawiera kilka ciekawych nowości, m.in.;
- Funkcja DATETRUNC
- Predykat: IS [NOT] DISTINCT FROM
- Funkcje APPROX_PERCENTILE_DISC(), APPROX_PERCENTILE_CONT(),
- Nowe role serwerowe
- CREATE EXTERNAL TABLE AS SELECT
- Zestaw funkcji do OPERACJI bitowych LEFT_SHIFT, RIGHT_SHIFT, BIT_COUNT, GET_BIT, SET_BIT
Poniżej opiszę dwie pierwsze z tych nowości
DATETRUNC()
Funkcja DATETRUNC ogranicza dokładność daty i godziny (np.. przedstawioną w latach, miesiącach i dniach do miesięcy).
Przyjmuje dwa argumenty:
- datepart (analogicznie do funkcji DATENAME, DATEADD itd.) – year/ quarter/ month/ day itd.
- date – data i/ lub godzina, którą chcemy „zaokrąglić”, akceptowane są wszystkie typy danych daty i czasu (smalldatetime, datetime, date, time, datetime2, datetimeoffset)
Podobny efekt można uzyskać za pomocą innej funkcji dostępnej w SQL Server 2022, DATE_BUCKET
Przykład użycia:
-- zaokrąglenie daty zwracanej przez funkcję GETDATE (typ danych datetime) do minuty
SELECT GETDATE() AS input_date,
DATETRUNC(minute, GETDATE()) AS result_datetrunc,
SQL_VARIANT_PROPERTY(DATETRUNC(month, GETDATE()),'BaseType') AS result_basetype
-- zaokrąglenie daty zwracanej przez funkcję SYSDATETIME (typ danych datetime2) do minuty
SELECT SYSDATETIME() AS input_date,
DATETRUNC(minute, SYSDATETIME()) AS result_datetrunc,
SQL_VARIANT_PROPERTY(DATETRUNC(month, SYSDATETIME()),'BaseType') AS result_basetype
Jak widać na powyższym screenie, Management Studio 19 Preview nie rozpoznaje jeszcze nazwy nowej funkcji.
Pełny opis funkcji w dokumentacji:
https://docs.microsoft.com/en-us/sql/t-sql/functions/datetrunc-transact-sql?view=sql-server-ver16
IS [NOT] DISTINCT FROM
Predykat, który gwarantuje, że w wyniku otrzymamy PRAWDĘ lub FAŁSZ (TRUE/ FALSE). Nawet jeśli jednym z argumentów działania jest wartość nieokreślona (NULL).
Używany w części zapytania WHERE, HAVING, JOIN ON.
Jego działanie i zestawienie z operatorem równości demonstrują poniższe przykłady.
Poniższa tabela, pochodząca z dokumentacji w czytelny sposób prezentuje tę różnicę.
CREATE TABLE #testctp21 (ColA int, ColB int)
INSERT INTO #testctp21 (ColA, ColB)
VALUES (0, 0), (0, 1), (0, NULL), (NULL, NULL)
SELECT * FROM #testctp21
/*
Porównywanie dwóch wartości
*/
-- = w wyniku tylko wartości, które w obu kolumnach są identycze, pomijając te w których występują NULL-e
SELECT ColA, ColB, 'ColA = ColB' FROM #testctp21 WHERE ColA = ColB
-- <> w wyiku tylko wartości, które w obu kolumnach są różne, pomijając te w których występują NULL-e
SELECT ColA, ColB, 'ColA <> ColB' FROM #testctp21 WHERE ColA <> ColB
-- IS NOT DISTINCT FROM w obu kolumnach identyczne wartości, w tym w obu wartości nieokreślone
SELECT ColA, ColB, 'ColA IS NOT DISTINCT FROM ColB' FROM #testctp21 WHERE ColA IS NOT DISTINCT FROM ColB
-- IS DISTINCT FROM w obu kolumnach różne wartości, w tym jeśli jedną z nich jest wartość nieokreślona
SELECT ColA, ColB, 'ColA IS DISTINCT FROM ColB' FROM #testctp21 WHERE ColA IS DISTINCT FROM ColB
/*
Porównywanie do wartości nieokreślonej (NULL)
*/
-- =/ <> ULL przyrównanie do wartości nieokreślonej, zawsze daje w wyniku zbiór pusty
SELECT ColA, ColB, 'ColA = NULL' FROM #testctp21 WHERE ColA = NULL
SELECT ColA, ColB, 'ColA <> NULL' FROM #testctp21 WHERE ColA <> NULL
-- IS NOT DISTINCT FROM NULL w pierwszej kolumnie wartość nieokreślona
SELECT ColA, ColB, 'ColA IS NOT DISTINCT FROM NULL' FROM #testctp21 WHERE ColA IS NOT DISTINCT FROM NULL
-- IS DISTINCT FROM NULL w pierwszej kolumnie wartość inna niż NULL
SELECT ColA, ColB, 'ColA IS DISTINCT FROM NULL' FROM #testctp21 WHERE ColA IS DISTINCT FROM NULL
Jak widać:
- IS NOT DISTINCT FROM można porównać do operatora równości =
- IS DISTINCT FROM można porównać do operatora <>
…z tym wyjątkiem, że te pierwsze nie pomijają NULL
W pewnych sytuacjach to znacznie uprości składnię warunków.
Oficjalna dokumentacja:
https://docs.microsoft.com/en-us/sql/t-sql/queries/is-distinct-from-transact-sql?view=sql-server-ver16
Kompletny kod powyższego przykładu znajdziesz tutaj:
https://github.com/kursysql/SQL-Server-2022/blob/main/sqlserver2022_ctp2_1.sql
