Бухгалтерия / Говнокод #20156 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
Запрос = Новый Запрос();
Запрос.Текст = "ВЫБРАТЬ
		|	РАЗНОСТЬДАТ(&Дата1, &Дата2, МЕСЯЦ) КАК РезультатРазность";
Запрос.УстановитьПараметр("Дата1",СтрТЧ.ДатаНачала);
Запрос.УстановитьПараметр("Дата2",СтрТЧ.ДатаОкончания);
Результат = Запрос.Выполнить().Выгрузить();
КолвоМесяцев = Результат[0].РезультатРазность+1;

Классика жанра. Ходим на сервер, чтобы посчитать разность дат. Ну да, сервер же у нас целыми днями воздух гоняет, заняться ему больше нечем. Давайте 2+2 складывать начнем через сервак.
Причем, б*ть, через сервер приложений, который в свою очередь погонит запрос на сервер MSSQL.

Запостил: mrbus mrbus, (Updated )

Комментарии (25) RSS

    • Разность дат в месяцах, причем с игнорированием дня и времени, (т. е. между 31.01.16 23:59:59 и 01.02.16 0:00:00 будет разность 1 месяц, так же как и между 01.01.16 и 29.02.16),
      считается элементарно:
      КолвоМесяцев = Месяц(ДатаОкончания) - Месяц(ДатаНачала) + 12 * (Год(ДатаОкончания) - Год(ДатаНачала))
      Ответить
    • В 1с хотя бы редко сокращают... А вот увидев всякие СРЗНАЧ и СТЬЮДРАСПОБР в экселе я долго плакал кровавыми слезами...
      Ответить
  • > Ходим на сервер, чтобы посчитать разность дат.

    Вы будете смеятся, но я раз такое в продакшене видел: это был воркараунд для обработки leap year & DST. потому что в приложении (С++) этого не могли сделать.
    Ответить
    • А я за текущим временем к sql ходил, чтобы не париться с синхронизацией часиков на клиенте...
      Ответить
      • в одной прикладухе народ говорил это тоже делали - пока не появился важный кастомер в алжире. они обслуживают на севере африки страны в четырех часовых поясях. на установку часового пояса в локальных офисах полагатся нельзя - поэтому им пришлось аппликуху на локальное время пересаживать, и все сторед просиджес/этц соответственно переписиывать.
        Ответить
        • вы оба так говорите, будто в этом есть что-то плохое

          если на клиенте в принципе нельзя полагаться, что там будет ntp, то время сервера - единственная вещь, с которой можно жить

          у нас есть пара систем, где число клиентов тысячами считается
          вот все они, к сожалению, при старте и далее регулярно в течение дня спрашивают сервер о реальном времени и ведут свои виртуальные часы (основанные на разнице серверного времени и системного), потому что иначе никак
          Ответить
          • Разница же непостоянна, как на неё можно полагаться?
            Ответить
            • +- пара секунд там терпимо

              или ты имеешь в виду, что пользователь вне клиента может переставить системные часы?
              может, это повод перезапросить серверное время ещё раз и уточнить новую разницу
              Ответить
                  • Осталось понять, когда перезапрашивать. А так как летнее время имеет тенденцию внезапно меняться в разных странах, придётся тянуть зависимость от tzdata.
                    Ответить
                    • > когда перезапрашивать
                      Никогда*. Просто надо просить у операционки значение монотонно растущего счётчика, а не время 😉 Ну или UTC, но его могут руками облапать.

                      *изредка, например раз в день, чтобы дрейф часов компенсировать
                      Ответить
                      • > монотонно растущего счётчика
                        хитрый какой
                        когда клиент на js, это всё становится уже не так тривиально

                        > когда перезапрашивать
                        когда локальное время внезапно не согласуется с ожиданиями, каким оно всё ещё должно быть с точки зрения клиента

                        как я уже писал, мне тут повезло, плюс минус несколько секунд никого не обломают - для задач хватает (часы в юзеринтерфейсе, слежение за расписанием работы в минутах), распространение серверного времени через http rest уже навлекает на себя приличную погрешность + таймеры в js сами по себе неточные (особенно, когда таб неактивный)
                        Ответить
  • Просто это самый простой для программиста способ.
    Это титановый костыль, который через пару месяцев станет несъемным протезом
    Ответить
  • > который в свою очередь погонит запрос на сервер MSSQL.
    а ты проверял профайлером, что действительно погонит на sql?
    тут нет обращения к таблицам данных
    Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8