PHP: сравнить два набора чисел, без дупликов

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

datediff(day, , ) + 1 - datediff(week, , ) * 2
    /* if start is a Sunday, adjust by -1 */
  + case when datepart(weekday, ) = 8 - @@datefirst then -1 else 0 end
    /* if end is a Saturday, adjust by -1 */
  + case when datepart(weekday, ) = (13 - @@datefirst) % 7 + 1 then -1 else 0 end

datediff(week, ...) всегда использует границу от субботы до воскресенья в течение недель, так что выражение детерминировано и не нуждается в модификации (пока наше определение будних дней постоянно с понедельника по пятницу). Нумерация дневного времени изменяется в соответствии с настройкой @@datefirst, и модифицированные вычисления обрабатывают эту коррекцию с небольшим усложнением некоторых модульная арифметика.

Более чистый способ борьбы с субботой / воскресенью - перевести даты до извлечения значения дня недели. После смещения значения вернутся в соответствие с фиксированной (и, вероятно, более знакомой) нумерацией, которая начинается с 1 в воскресенье и заканчивается 7 в субботу.

datediff(day, , ) + 1 - datediff(week, , ) * 2
  + case when datepart(weekday, dateadd(day, @@datefirst, )) = 1 then -1 else 0 end
  + case when datepart(weekday, dateadd(day, @@datefirst, ))   = 7 then -1 else 0 end

Я отслеживал эту форму решение, по крайней мере, до 2002 года и статья Ицика Бен-Гана. ( https://technet.microsoft.com/en-us/library/aa175781 (v = sql.80) .aspx ) Хотя для этого требуется небольшая настройка, поскольку новые типы date не [a]

EDIT: Я добавил обратно +1, который каким-то образом был остановлен. Также стоит отметить, что этот метод всегда учитывает начальные и конечные дни. Он также предполагает, что конечная дата включена или после даты начала.

0
задан WMI 23 January 2012 в 01:35
поделиться