TRUNC (date) function conversion from Oracle to Microsoft SQL Server

Функция TRUNC (date) возвращает дату с временной частью дня, усеченной до единицы, заданной в формате fmt. Microsoft SQL Server не поддерживает функцию TRUNC, поэтому необходимо создать дополнительный объект, а именно функцию, которая имитирует работу TRUNC.

Создадим следующую функцию:

 create function dbo.SWF_TruncDate(@pDate datetime, @FmtStr varchar(255))
 returns datetime
 begin
   IF (UPPER(@FmtStr) = 'YEAR' or UPPER(@FmtStr) = 'YY' or UPPER(@FmtStr) = 'YYYY' or UPPER(@FmtStr) = 'Y' or UPPER(@FmtStr) = 'YYY')
     RETURN convert(varchar,year(@pDate))+'-01-01'
   ELSE IF (UPPER(@FmtStr) = 'MONTH' or UPPER(@FmtStr) = 'MM' or UPPER(@FmtStr) = 'MON')
     RETURN convert(varchar,year(@pDate))+'-'+convert(varchar,month(@pDate))+'-01'
   ELSE IF (UPPER(@FmtStr) = 'DD' or UPPER(@FmtStr) = 'DDD')
     RETURN convert(varchar,@pDate,111)
   ELSE IF (UPPER(@FmtStr) = 'D' or UPPER(@FmtStr) = 'DY' or UPPER(@FmtStr) = 'DAY')
     RETURN convert(datetime,convert(varchar,@pDate,111))
   ELSE IF (UPPER(@FmtStr) = 'HOUR' or UPPER(@FmtStr) = 'HH' or UPPER(@FmtStr) = 'HH12' or UPPER(@FmtStr) = 'HH24')
     RETURN convert(varchar,@pDate,111)+' '+convert(varchar,datepart(hh,@pDate))+':00:00'
   ELSE IF (UPPER(@FmtStr) = 'MINUTE' or UPPER(@FmtStr) = 'MI')
     RETURN convert(varchar,@pDate,111)+' '+convert(varchar,datepart(hh,@pDate))+':'+convert(varchar,datepart(mi,@pDate))+':00'

   RETURN @pDate
 end

Функция проверяет параметр FmtStr, и если он имеет значение 'YEAR'/'YY'/'YYY'/'YYY', то она возьмет год, указанный в параметре pDate, и объединит его с '-01-01' (1 января). Если параметр FmtStr имеет значение 'MONTH'/'MM'/'MON', функция вернет конкатенацию года, месяца из параметра pDate и '-01', то есть начало месяца. Если параметр FmtStr имеет значение 'DD'/'DDD'/'D'/'DY'/'DAY', функция вернет дату, усеченную до дня. 'DD' является значением по умолчанию, если параметр FmtStr не указан в источнике. Если параметр FmtStr имеет значение 'HOUR'/'HH'/'HH12'/'HH24', то возвращаемое значение будет представлять собой дату, усеченную до часа. А если параметр FmtStr имеет значение 'MINUTE'/'MI', то возвращаемое значение будет представлять собой дату, усеченную до минуты.

Рассмотрим работу данной функции:

Oracle Microsoft SQL Server
select trunc(TO_DATE('25-AUG-22','DD-MON-YY')) from dual;
TRUNC(TO_DATE('25-AUG-22','DD-MON-YY'))
25-AUG-22
select dbo.SWF_TruncDate(CONVERT(DATETIME,'25-AUG-22'),'DD');
(No column name)
2022-08-25 00:00:00.000
select trunc(TO_DATE('25-AUG-22','DD-MON-YY'), 'YY') from dual;
TRUNC(TO_DATE('25-AUG-22','DD-MON-YY'),'YY')
01-JAN-22
select dbo.SWF_TruncDate(CONVERT(DATETIME,'25-AUG-22'),'YY');
(No column name)
2022-01-01 00:00:00.000
select trunc(TO_DATE('25-AUG-22','DD-MON-YY'), 'MONTH') from dual;
TRUNC(TO_DATE('25-AUG-22','DD-MON-YY'),'MONTH')
01-AUG-22
select dbo.SWF_TruncDate(CONVERT(DATETIME,'25-AUG-22'),'MONTH');
(No column name)
2022-08-01 00:00:00.000
select trunc(TO_DATE('25-AUG-22','DD-MON-YY'), 'DDD') from dual;
TRUNC(TO_DATE('25-AUG-22','DD-MON-YY'),'DDD')
25-AUG-22
select dbo.SWF_TruncDate(CONVERT(DATETIME,'25-AUG-22'),'DDD');
(No column name)
2022-08-25 00:00:00.000

Как видите, функция TRUNC была заменена созданной функцией SWF_TruncDate. Вы можете сами убедиться, что запросы эквивалентны и возвращают один и тот же набор результатов.

Это решение автоматически выполняется нашим программным обеспечением Конвертум Мастером. Узнать о других возможностях инструмента, а также протестировать демолицензию вы можете на нашем сайте.


Если у вас есть дополнительные вопросы, пожалуйста, свяжитесь с нами: support@convertum.ru