Тег: MS SQL Server

Misrosoft SQL Server

Високосный год в SQL.

По григорианскому календарю год считается високосным если он кратен 4, но при этом не кратен 100, либо кратен 400. С учетом этого можем написать функцию для определения “високосности” года.

create function [dbo].[isLeapYear]
(@date date)
returns bit
as
begin
return (case
			when year(@date) % 4 = 0 and year(@date) % 100 != 0
			then 1
			when year(@date) % 400 = 0
			then 1
			else 0
		end)
end

Функция может принимать любую дату в качестве аргумента и возвращает единицу если год високосный, в противном случае – 0:

Пример использования функции isLeapYear

Количество дней в месяце SQL.

Узнать количество дней в месяце в t-SQL можно таким образом:

declare @date datetime = getdate()
declare @dayCount int
set @dayCount = day(dateadd(dd, -day(dateadd(mm, 1, @date)), dateadd(mm, 1, @date)))
select @dayCount

В этом коде количество дней в месяце определяется функцией day от последнего числа месяца. Последнее число месяца в моем случае находится добавлением к текущей дате одного месяца и “вычитанием” от неё дня месяца полученной даты. Начиная с MS SQL 2012ой версии, последнее число можно найти с использованием встроенной функции EOMonth. Т.е. необходимо третью строку в коде выше заменить следующей строкой:

set @dayCount = day(eomonth(@date))

В итоге наша функция будет выглядеть так:

create function [dbo].[monthDayCount]
(@date datetime)
returns int
as
begin
return (day(dateadd(dd, -day(dateadd(mm, 1, @date)), dateadd(mm, 1, @date))))
end

Как получить начало квартала в SQL?

Начало квартала в MS SQL Server’е можно получить следующим образом:

declare @d datetime = getdate()
set @d = dateadd(qq, datediff(qq, 0, @d), 0)
select @date

Здесь используется то, что функция datediff возвращает разницу в кварталах между “началом времен” в SQL и искомой датой. Затем к этому “началу времен” прибавляется разница в кварталах и получается начало квартала от нужной даты @date.
Функция будет иметь вид:

create function [dbo].[quarterStart]
(@d datetime)
returns datetime
as
begin
return (dateadd(qq, datediff(qq, 0, @d), 0))
end

Пример использования функции:
=Пример использования функции quarterStart

Как получить первое число месяца в SQL?

Очень часто бывает необходимо в аналитических процедурах в MS SQL Server’e “вытащить” первое число месяца. Например, в отчетах месяц можно отображать как первое число этого месяца, что весьма удобно с точки зрения сортировки данных в сводной таблице MS Excel.

В t-SQL можно поступить таким образом:

declare @d datetime = getdate()
set @d = dateadd(day, - datepart(day, @d) + 1, convert(date, @d))
select @d

Здесь с помощью встроенной функции dateadd от переменной @d вычитается количество дней равное дате в исходном месяце (получается последняя дата предыдущего месяца) и прибавляется один день, чтобы получить первое число исходного месяца. Для того, чтобы избавиться  от “лишнего” времени применяем функцию convert, где преобразуем переменную @d к типу date (только дата без времени).

Можно даже написать функцию, которая принимает в качестве параметра дату

create function [dbo].[monthStart]
(@d datetime)
returns datetime
as
begin
return (dateadd(day, - datepart(day, @d) + 1, convert(date, @d)))
end

Пример использования функции:
Пример использования функции monthStart