Дни между двумя датами с годами, месяцами, днями - PullRequest
0 голосов
/ 23 сентября 2019

Можно ли сделать так, чтобы запрос предоставлял дни между двумя датами для подсчета дней, оставшихся без ответа, с текущей датой и выходными данными: годы, месяцы, дни и дни ожидания, обеспечивающие 30 дней, 60 дней, 90 дней?

Если я объявляю «Годы, месяцы, дни» из «Check_Date» и «Created_Date».SQL предоставляет отдельное окно, и я вижу только объявленное время «FromDate» с «ToDate», отображающим общее количество лет, месяцев и дней.Я ищу способ получения результатов в виде записей BY "Created_Date", включающих: годы, месяцы, дни и дни выдачи, обеспечивающие 30 дней, 60 дней, 90 дней?

Код Scrip:

DECLARE @FromDate DATETIME = '2015-01-01 00:00:00', 
        @ToDate   DATETIME = '2019-09-18 00:00:00',
        @Years INT, @Months INT, @Days INT, @tmpFromDate DATETIME
SET @Years = DATEDIFF(YEAR, @FromDate, @ToDate)
 - (CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @FromDate, @ToDate),
          @FromDate) > @ToDate THEN 1 ELSE 0 END) 


SET @tmpFromDate = DATEADD(YEAR, @Years , @FromDate)
SET @Months =  DATEDIFF(MONTH, @tmpFromDate, @ToDate)
 - (CASE WHEN DATEADD(MONTH,DATEDIFF(MONTH, @tmpFromDate, @ToDate),
          @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 

SET @tmpFromDate = DATEADD(MONTH, @Months , @tmpFromDate)
SET @Days =  DATEDIFF(DAY, @tmpFromDate, @ToDate)
 - (CASE WHEN DATEADD(DAY, DATEDIFF(DAY, @tmpFromDate, @ToDate),
          @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 

SELECT @FromDate FromDate, @ToDate ToDate, 
       @Years Years,  @Months Months, @Days Days



SELECT DISTINCT  
ge.Name, --table columns
ge.Entity_Type, 
ge.Entity_Number, 
bc.Super_Entity_ID, 
ch.Check_Date, --check created
ch.Created_Date, --if payment was received
ch.Check_Number, 
ch.Amount,
vn.Vendor_Name



Check_Date,Created_Date,DATEDIFF("DAY",Check_Date,Created_Date) AS DAY


FROM dbo.gl_entities AS ge
INNER JOIN
dbo.super_entity AS se
ON ge.Super_Entity_ID = se.Super_Entity_ID 
INNER JOIN
dbo.bank_codes AS bc
ON se.Super_Entity_ID = bc.Super_Entity_ID 
INNER JOIN
dbo.checks AS ch
ON bc.Bank_Code_ID = ch.Bank_Code_ID 
INNER JOIN
dbo.vendors AS vn
ON ch.Vendor_ID = vn.Vendor_ID


WHERE 
ge.Active = 1 and vn.active = 1 and (ge.IS_Shadow = 1 OR se.IS_Tiered = 0)

AND CHECK_DATE > '20150101 00:00:00'
AND CHECK_DATE< '20190918 00:00:00'

ORDER BY ch.Check_Date, ch.Created_Date

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

псевдокод, чтобы попытаться продемонстрировать перемещение операторов набора для выбора операторов

declare @begin date = '2018-01-01'
declare @end date = '2019-01-01'

declare @middletest int = datediff("dd", @begin, @end)/2
declare @middledate date = dateadd("dd", @middletest, @begin)
declare @middlemonth int = month(@middledate)

select @middlemonth half_month, @middledate middle_date
   -- ,other_columns here
from table
where something

Начать замену.@middlemonth находится в операторе выбора, поэтому замените его на месяц (@middledate).

declare @begin date = '2018-01-01'
declare @end date = '2019-01-01'

declare @middletest int = datediff("dd", @begin, @end)/2
declare @middledate date = dateadd("dd", @middletest, @begin)

select month(@middledate) half_month, @middledate middle_date
   -- ,other_columns here
from table
where something

@ middledate теперь находится в операторе выбора в 2 местах, поэтому замените его на dateadd ("dd", @middletest,@begin) каждый раз.

declare @begin date = '2018-01-01'
declare @end date = '2019-01-01'

declare @middletest int = datediff("dd", @begin, @end)/2

select month(dateadd("dd", @middletest, @begin)) half_month,
    dateadd("dd", @middletest, @begin) middle_date
    -- ,other_columns here
from table
where something

Продолжайте.

declare @begin date = '2018-01-01'
declare @end date = '2019-01-01'

select month(dateadd("dd", datediff("dd", @begin, @end)/2, @begin)) half_month,
    dateadd("dd", datediff("dd", @begin, @end)/2, @begin) middle_date
    -- ,other_columns here
from table
where something

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

select month(dateadd("dd", datediff("dd", start_date, getdate())/2, start_date)) half_month,
    dateadd("dd", datediff("dd", start_date, getdate())/2, start_date) middle_date
    -- ,other_columns here
from table
where something
0 голосов
/ 23 сентября 2019

Чтобы просто повторить их в своих собственных столбцах в запросе:

DECLARE @FromDate DATETIME = '2015-01-01 00:00:00', 
        @ToDate   DATETIME = '2019-09-18 00:00:00',
        @Years INT, @Months INT, @Days INT, @tmpFromDate DATETIME
SET @Years = DATEDIFF(YEAR, @FromDate, @ToDate)
 - (CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @FromDate, @ToDate),
          @FromDate) > @ToDate THEN 1 ELSE 0 END) 


SET @tmpFromDate = DATEADD(YEAR, @Years , @FromDate)
SET @Months =  DATEDIFF(MONTH, @tmpFromDate, @ToDate)
 - (CASE WHEN DATEADD(MONTH,DATEDIFF(MONTH, @tmpFromDate, @ToDate),
          @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 

SET @tmpFromDate = DATEADD(MONTH, @Months , @tmpFromDate)
SET @Days =  DATEDIFF(DAY, @tmpFromDate, @ToDate)
 - (CASE WHEN DATEADD(DAY, DATEDIFF(DAY, @tmpFromDate, @ToDate),
          @tmpFromDate) > @ToDate THEN 1 ELSE 0 END) 


SELECT DISTINCT  
ge.Name, --table columns
ge.Entity_Type, 
ge.Entity_Number, 
bc.Super_Entity_ID, 
ch.Check_Date, --check created
ch.Created_Date, --if payment was received
ch.Check_Number, 
ch.Amount,
vn.Vendor_Name,
Check_Date,Created_Date,DATEDIFF("DAY",Check_Date,Created_Date) AS DAY,
@FromDate FromDate, @ToDate ToDate, @Years Years,  @Months Months, @Days Days

FROM
. . .

Если у вас возникнут проблемы с предложением DISTINCT, вы всегда можете использовать подзапрос.Если вы хотите, чтобы годы, месяцы и дни были разными в зависимости от одного из столбцов, вам нужно будет уточнить, и тогда мы сможем переместить все, что вы делали в инструкциях SET, в инструкцию SELECT.

Без ваших таблици данные, которые я не могу проверить очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...