2015-08-11 2 views
0

Я собираюсь преобразовать некоторые запросы MS Access в T-SQL (для использования с службами отчетов SQL), и у меня возникла проблема.Преобразование запроса MS Access в T-SQL - функция datepart

Оказалось, что в запросах MS Access есть функция DATEPART, которая имеет два необязательных параметра (параметры, которые не имеют соответствующей функции DATEPART T-SQL): firstdayofweek и firstweekofyear. И я не могу понять, как создать эквивалентный запрос в T-SQL.

Ниже приведен исходный запрос MS Access (урезано до всего соответствующих данных):

SELECT datepart("ww",OrderDate, 7, 2) AS WeekNumber FROM Orders; 

Примечание: в данном случае 7 означает для расчета с субботы, как в первый день недели, и 2 означает рассчитать первую неделю в году как первую с 4 (или более) днями.

Как это сделать в T-SQL?

+0

вы попробовать это - https://msdn.microsoft.com/en-us /library/ms174420.aspx? – Bulat

+0

Да, вот где я начал. К сожалению, эта функция не принимает эти два необязательных параметра (firstdayofweek и firstweekofyear), и результаты разные. Чтобы дать вам идею, я собрал быстрый образец (один в доступе в SQL), чтобы увидеть результаты, и если я поставлю дату 4/1/2014, доступ дает мне неделю 13, SQL дает мне неделю 14 Но если я подключу дату 4/1/2013, оба дают мне 14, так что это не так просто, как просто вычитать один из результата SQL. – Scott

+0

Вы видели это? https://msdn.microsoft.com/en-us/library/ms181598.aspx – Bulat

ответ

2

Аргументы вы ссылаетесь являются:

firstdayofweek

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

Constant Value  Explanation 
------------------------------------------------ 
vbUseSystem  0  Use the NLS API setting 
vbSunday  1  Sunday (default) 
vbMonday  2  Monday 
vbTuesday  3  Tuesday 
vbWednesday  4  Wednesday 
vbThursday  5  Thursday 
vbFriday  6  Friday 
vbSaturday  7  Saturday 

эквивалент в SQL Server SET DATEFIRST, обратите внимание, что это начинается в понедельник, а не воскресенье, так что следующий будет возвращать 2 (так как сегодня вторник);

SET DATEFIRST 1; 
SELECT [WEEKDAY] = DATEPART(WEEKDAY, CAST('2015-08-11' AS DATE)); 

Следующий аргумент:

firstweekofyear

Дополнительно. Это константа, указывающая первую неделю года. Если этот параметр опущен, Access предполагает, что неделя, содержащая 1 января, является первой неделей года. Этот параметр может быть одним из следующих значений:

Constant   Value Explanation 
--------------------------------------------------------------------------- 
vbUseSystem   0  Use the NSL API setting 
vbFirstJan1   1  Use the first week that includes Jan 1st (default) 
vbFirstFourDays  2  Use the first week in the year that has at least 4 days 
vbFirstFullWeek  3  Use the first full week of the year 

Стандарт DATEPART(WEEK, @Date) является эквивалентом vbFirstJan1, это приведет к сбросу номер недели на первом из Jan, то после этого увеличивается на 1 при каждом прохождении независимо устанавливается как DATEFIRST.

clostest эквивалентно vbFirstFourDays является использование DATEPART(ISO_WEEK, @Date), то стандарт ISO определяет первую неделю года в первой неделе, чтобы содержать 4 дня, это не совсем эквивалентно, поскольку это не влияет на DATEFIRST, стандарт определяет ISO неделя как понедельник до воскресенья, поэтому ISO_WEEK также делает, независимо от DATEFIRST или региональных настроек.

Нет эквивалента на уровне vbFirstFullWeek.

Я нашел, что это обычно бизнес-логика, которая диктует любые отклонения от этих стандартных определений чисел недели или числа дней, так как это почти всегда лучше всего обрабатывается путем создания себя calendar table, после чего вы можете добавить свой новый столбец в его и запустить одно обновление. Например, мне приходилось сообщать в течение недель, начиная с четверга по среду, для комиссионных платежей, где первая неделя года была определена как первая полная неделя (так что в доступе это будет DATEPART("ww", [Date], 4, 5)), без эквивалентной функции в MS SQL Я добавил новый столбец в таблице расписания PaperSalesCommissionWeekNumber, тогда я мог бы присоединиться к моему столу календаря, чтобы получить номер недели:

SELECT c.PaperSalesCommissionWeekNumber 
FROM dbo.Deal AS d 
     INNER JOIN dbo.Calender AS c 
      ON d.DealDate = c.DateKey; 
Смежные вопросы