Sql 两个日期之间的天数,包括年、月、日

Sql 两个日期之间的天数,包括年、月、日,sql,sql-server,Sql,Sql Server,是否可以让查询提供两个日期之间的天数来计算 带有今天日期和输出的未付天数:年、月、日和 未付天数提供30天、60天、90天 如果我从“检查日期”和“创建日期”声明“年、月、日”。 SQL提供了一个单独的窗口,我只看到声明的“FromDate”时间 “ToDate”显示总的年、月、日。我正在寻找一种方法 让结果提供“创建日期”记录的滚动,包括: 年、月、日和未付日提供30天、60天、90天 几天 票据代码: DECLARE @FromDate DATETIME = '2015-01-01 00:0

是否可以让查询提供两个日期之间的天数来计算 带有今天日期和输出的未付天数:年、月、日和 未付天数提供30天、60天、90天

如果我从“检查日期”和“创建日期”声明“年、月、日”。 SQL提供了一个单独的窗口,我只看到声明的“FromDate”时间 “ToDate”显示总的年、月、日。我正在寻找一种方法 让结果提供“创建日期”记录的滚动,包括: 年、月、日和未付日提供30天、60天、90天 几天

票据代码:

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
DECLARE@FromDate-DATETIME='2015-01-01 00:00:00',
@ToDate DATETIME='2019-09-18 00:00:00',
@年整数、@Months整数、@Days整数、@tmpFromDate日期时间
设置@Years=DATEDIFF(年、@FromDate、@ToDate)
-(DATEADD(年份,DATEDIFF(年份,@FromDate,@ToDate)时的情况),
@FromDate)>@ToDate然后是1其他0结束)
设置@tmpFromDate=DATEADD(年、@Years、@FromDate)
设置@Months=DATEDIFF(月、@tmpFromDate、@ToDate)
-(DATEADD(月,DATEDIFF(月,@tmpFromDate,@ToDate)时的情况),
@tmpFromDate)>@ToDate然后1,否则0结束)
设置@tmpFromDate=DATEADD(月、@Months、@tmpFromDate)
设置@Days=DATEDIFF(DAY、@tmpFromDate、@ToDate)
-(DATEADD(DAY,DATEDIFF(DAY,@tmpFromDate,@ToDate)时的大小写),
@tmpFromDate)>@ToDate然后1,否则0结束)
选择@FromDate FromDate、@ToDate ToDate、,
@年-年、@月、@天
选择不同的
ge.Name,--表列
通用电气实体类型,
通用电气公司实体编号,
bc.Super\u实体\u ID,
ch.Check_日期,--已创建支票
ch.U创建日期,--如果收到付款
总检查号,
ch.金额,
vn.Vendor\u名称

勾选日期、创建日期、日期差异(“天”,勾选日期、创建日期)为天 来自dbo.gl_实体作为ge 内连接 dbo.super_实体作为se 关于ge.Super\u Entity\u ID=se.Super\u Entity\u ID 内连接 dbo.bank_代码为bc 在se.Super\u Entity\u ID=bc.Super\u Entity\u ID上 内连接 dbo.ch 在bc.Bank\U Code\U ID=ch.Bank\U Code\U ID上 内连接 dbo.vn 在ch.Vendor\u ID=vn.Vendor\u ID上 哪里 ge.Active=1和vn.Active=1和(ge.IS_Shadow=1或se.IS_分层=0) 并检查日期>'20150101 00:00:00' 并检查日期<'20190918 00:00:00' 按总检查日期、总创建日期订购
要在查询中自己的列中重复它们,请执行以下操作:

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语句中


没有您的表和数据,我无法很好地进行测试。

使用伪代码尝试并演示如何将set语句移动到select语句

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在select语句中,因此将其替换为month(@middledate)

@middledate现在位于select语句的两个位置,因此每次都用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

转换为年/月/日比你想象的要复杂得多。2019-02-28和2019-03-01之间有什么区别?2019-03-27? 2019-03-28? 还是2019-01-31和2019-01-28?或者2016-02-29和2017-02-28?或者2017-03-01?看一看“只是为了说明”的具体情况。我想,如果我的支票日期2015-01-01/2015-08-01是全额支票付款的创建日期,那么我应该有8天的时间,但是,我需要知道这些旧日期的总金额和今天的日期,2019-23-09。看起来你已经拥有了数年、数月、数天的代码。我不确定我是否了解哪些地方工作不正常。您是否正在尝试将第一个选择结果与第二个选择结果合并?澄清你所说的“单独窗口”和“滚动”是什么意思。@avery_larry,当我运行我的代码时,根据从日期到日期的声明,我只得到1个结果的年/月/天。我希望在ch.Created_Date旁边的列行中显示所有年/月/日。我添加了更新的代码,其中包含SELECT,FromDate和ToDate,DATETIME='2015-01-01 00:00:00',DATETIME='2019-09-18 00:00:00'。是否有方法让脚本计算从SELECT DISTINCT-Check_Date和Created_Date开始的年、月、日?SET语句提供年、月、日。是否可以将所有数据移动到SELECT语句中,其中仅提供ch.Check\U Date与ch.Created\U Date之间的年、月、日/行?也许我们可以使用GETDATE优化脚本,使用DATEDIFF?Check_Date,Created_Date,DATEDIFF(“DAY”,Check_Date,Created_Date)作为天,DATEDIFF(YEAR,Created_Date,GETDATE())作为年,DATEDIFF(MONTH,Created_Date,GETDATE())作为月,DATEDIFF(DAYOFYEAR,Created_Date,GETDATE())作为混乱的日期%31。但实际上,您用相应的set语句替换select语句中的所有变量。在需要中间答案的情况下,必须使用子查询生成中间值。
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