Вычисление 2 недель для каждой недели SQL

#sql #sql-server #hardcode

#sql #sql-server #жесткий код

Вопрос:

Я все еще новичок в SQL, поэтому этот вопрос, который я задаю, может быть легким для вас. Итак, я создаю отчет, который за каждую неделю генерирует предыдущие 14 дней (или 2 недели) финансируемых контрактов. Я знаю, что это должно быть жестко запрограммировано для конкретной компании. Идентификатор для этой конкретной компании равен «55», так что может кто-нибудь помочь мне с этой функцией? Мой запрос, который я знаю, еще не завершен, я просто застрял на том, как ввести функцию даты для этого.

 Create PROC [dbo].[spAdminFundedDateee]

   Begin

        SELECT  c.program_id, d.dealer_code,b.last_name As DealerName, a.account_no, a.vin, 
                ((e.last_name) ',' (e.first_name)) As Name, a.funded_date, a.cancel_refund_date,
                  a.purchase_date,a.miles, a.duration,a.sale_price,a.number_of_payments,
                  a.sales_tax, a.downpayment

        from tDealer d 
    Join tContact b ON d.contact_id = b.contact_id 
    Join tContract a On d.dealer_id = a.dealer_id 
    Join tCompany c ON d.company_id= c.company_id
    Join tContact E On e.contact_id = a.contact_id

        Where c.program_id = 55 And a.funded_date between 

      End

    exec spAdminFundedDateee '05/1/2014','05/30/2014','55'
  

Комментарии:

1. Прочитайте документацию SQL Server по хранимым процедурам, особенно раздел о передаче параметров. В этом случае вы могли бы передать параметры @ProgramID и @FundedDate и вычислить начальную дату периода из параметра funded date .

2. Прежде всего, вам нужно будет указать свои параметры в SP. а затем вы могли бы просто сделать между [@BeginDate] и [@EndDate] .

3. Я собирался это сделать, но мой босс хочет, чтобы это было без параметров. У меня это должно быть жестко запрограммировано. Также это станет подпиской

Ответ №1:

Чтобы проверить, находится ли.funded_date между сегодняшней датой и датой двухнедельной давности, вам понадобится несколько функций sql server. Первый — GetDate() . Это возвращает текущую дату и время в качестве значения datetime.

Теперь вы хотите проверить только параметр даты (не время). Если кто-то запускает вашу хранимую процедуру в 1 час дня, вы не хотите удалять все данные до 1 часа дня 14 дней назад. Вам нужны все данные, независимо от времени, начиная с 14 дней назад. Чтобы решить эту проблему, мы хотим изменить getDate() только на дату. итак, приведите (getDate() в качестве даты). Сегодня это вернет 6-18-14.

Наконец, вы хотите проверить дату двухнедельной давности. dateAdd позволяет добавлять любое количество времени, которое вы указываете, к дате или времени. в этом случае вам нужна информация за 14 дней. это будет выглядеть как dateadd(dd, -14, приведение(getDate() в качестве даты)).

Поскольку значение between включено, все, что вам нужно сделать сейчас, это собрать их вместе!

 between dateadd(dd, -14, cast(getDate() as date)) and cast(getDate() as date)
  

Комментарии:

1. Итак, я попробовал ваш кодек. Я собрал все это вместе, но при выполнении не получаю никакого результата. Что-то не так в моем sp?

2. @user3753188 вы получаете пустую таблицу или сообщение об ошибке? если вы получаете пустую таблицу, вам следует попытаться просмотреть информацию, хранящуюся в ваших таблицах, и найти точки данных, которые этот запрос должен вернуть.

Ответ №2:

если.funded_date является DATETIME, то

 a.funded_date between dateadd(day,-14,getdate()) and getdate()
  

если.funded_date — это ДАТА, то

  a.funded_date between cast(dateadd(day,-14,getdate()) as date) and cast(getdate() as date)
  

Комментарии:

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

Ответ №3:

Привет, ребята, итак, я обновил свое предложение Where, но когда я запускаю запрос, я получаю заголовок столбца, но с пустой таблицей. Когда я ввел жесткий код дат, это правильно? Я все еще новичок в функции даты, поэтому я знаю, что это должно быть здравым смыслом для большинства из вас, чем для меня. Я предполагаю жестко указать даты, предшествующие 14 дням, и предполагаю получать финансируемые контракты каждый понедельник до 14 дней каждые 2 недели. Это мой первый отчет, поэтому я прошу прощения за то, что задал несколько вопросов, которые, по мнению некоторых из вас, я должен знать. Я все еще учусь.

       Alter PROC [dbo].[spAdminFundedDateee]
      As
         Begin
             SELECT  c.program_id, d.dealer_code,b.last_name As DealerName, a.account_no, 
                     a.vin,  ((e.last_name) ',' (e.first_name)) As Name, 
                     a.funded_date, a.cancel_refund_date, a.purchase_date,a.miles, 
                     a.duration,a.sale_price,a.number_of_payments,  a.sales_tax, a.downpayment


      from tDealer d 
       Join tContact b ON d.contact_id = b.contact_id 
       Join tContract a On d.dealer_id = a.dealer_id 
       Join tCompany c ON d.company_id= c.company_id
       Join tContact E On e.contact_id = a.contact_id


     Where c.program_id = 55 And  a.funded_date between '05/19/2014' and '06/02/2014'And 
           a.funded_date between  dateadd(dd, -14, cast(getDate() as date)) and cast(getDate()
           as date)


     END
     GO

    EXEC spAdminFundedDateee