【问题标题】:SQL difference between dates(year,month,day)日期(年、月、日)之间的 SQL 差异
【发布时间】:2016-12-15 07:18:45
【问题描述】:

我在获取年、月、日两个日期之间的差异时遇到了问题,而无需使用函数,仅使用 Select 语句。

到目前为止,我有这个凌乱的代码,但它不能很好地工作,因为有时月/日是 - 。 tblProject.BillingDate 是 StartDate,tblServiceTicket.ServiceTicketDate 是 EndDate。

         CONVERT(varchar(12),datediff(YEAR,tblProject.BillingDate,tblServiceTicket.ServiceTicketDate))  + ' year, '
        + CONVERT(varchar(12),DATEDIFF(MM, DATEADD(YY, datediff(YEAR,tblServiceTicket.ServiceTicketDate,tblProject.BillingDate), tblServiceTicket.ServiceTicketDate), tblProject.BillingDate)) + ' months, '
        + CONVERT(varchar(12),DATEDIFF(DD, DATEADD(MM, DATEDIFF(MM, DATEADD(YY, (datediff(YEAR,tblProject.BillingDate,tblServiceTicket.ServiceTicketDate)), tblProject.BillingDate), tblServiceTicket.ServiceTicketDate), DATEADD(YEAR, datediff(YEAR,tblProject.BillingDate,tblServiceTicket.ServiceTicketDate) , tblProject.BillingDate)), tblServiceTicket.ServiceTicketDate)) + ' days '

【问题讨论】:

  • 你为什么不单独使用 DATEDIFF?
  • 你确实在你的例子中使用了 CONVERT 函数。
  • Datediff 将不得不被使用,但不是你想的那样。您将不得不设置许多规则来处理现实世界的案例,例如@dstart = '20161231'@dend = '20170101',其中DATEDIFF 无论您检查年、月还是日都会返回 1。您正在寻找的是年、月、日的 INTERVAL 计算,而不是 datediff 类型的函数。

标签: sql sql-server


【解决方案1】:

我知道这样做的唯一方法是半迭代,就像这样。这个版本可以通过围绕 DATEDIFF 进行编码来改进,但它比 DATEDIFF 版本更清楚地显示了所需的逻辑。

DECLARE @dstart datetime, 
    @dend datetime,
    @dwork datetime

DECLARE @yy int, 
    @mm int, 
    @dd int

SET @dstart = '19570125'
SET @dend = '20161214'

DECLARE @ix int

-- Get Year interval
SET @ix = 0
WHILE @ix >= 0
BEGIN
    Set @ix = @ix + 1
    IF Dateadd(year, @ix, @dstart) > @dend
    BEGIN
        SET @yy = @ix - 1
        SET @ix = -1
    END
END

Set @dwork = Dateadd(year, @yy, @dstart)

-- Get month interval
SET @ix = 0
WHILE @ix >= 0
BEGIN
    Set @ix = @ix + 1
    IF Dateadd(MONTH, @ix, @dwork) > @dend
    BEGIN
        SET @mm = @ix - 1
        SET @ix = -1
    END
END

Set @dd = DATEDIFF(day, dateadd(month, @mm, @dwork), @dend)

SELECT 'The difference is ' + Cast(@yy as varchar) + ' years, ' + Cast(@mm as varchar) + ' Months, and ' + Cast(@dd as varchar) + ' Days'

以下是一些示例输出,展示了它如何处理几个问题案例。

-- One day at new years
SET @dstart = '20161231'
SET @dend = '20170101'

-- The difference is 0 years, 0 Months, and 1 Days

-- One month to a shorter month
SET @dstart = '20160131'
SET @dend = '20170228'

-- The difference is 1 years, 1 Months, and 0 Days

-- My age
SET @dstart = '19570125'
SET @dend = '20161214'

-- The difference is 59 years, 10 Months, and 19 Days

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 2022-10-02
    • 2016-07-10
    • 2013-07-17
    • 2016-03-22
    • 1970-01-01
    • 2018-04-24
    相关资源
    最近更新 更多