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