2012-09-14 112 views
4

输入的一种更好的方式:构建查询

Month, Year, GraceMonth.全部都是整数。

我们需要做什么?

首先需要构建从月,年和一天的日期(需要从当前日期来获得) ,然后添加到GraceMonth将it.We加入GraceMonth后得到新的日期明显。 接下来,从构建的日期开始,我们需要将其与当前日期进行比较。

你有什么试过?

例如(我在零件显示)

DECLARE @Month INT = 11 
DECLARE @YEAR INT = 2012 
DECLARE @Graceperiod INT = 2 

SELECT 
    [Construct Initial Date] = DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1) --construct initial date 
    ,[Add Grace period] =DATEADD(mm,@Graceperiod,DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1)) --add grace month 
    ,[DateDiff] = DATEDIFF 
      (
       DAY, 
       DATEADD(mm, (@YEAR - 1900) * 12 + (@Month + @Graceperiod) - 1 , DAY(GETDATE()) - 1), 
       GETDATE() 
      ) -- datediff 

结果

Construct Initial Date  Add Grace period    DateDiff 
2012-11-14 00:00:00.000  2013-01-14 00:00:00.000  -122 

如果你的答案是正确的,那么你在找什么?

除此之外还有其他的好办法吗?没有铸造越简洁越好。如果涉及一些棘手的部分(例如一些棘手的数学计算),请提供解释。

在此先感谢。

+1

第一个观察结果是:为什么不把'@ Month'和'@ Graceperiod'加在一起,而不是与他们一起做两个单独的'DATEADD(月...)调用? –

+0

先生,我在[Datediff]专栏中更新了以下建议 –

回答

1
DECLARE @Month INT = 11 
DECLARE @YEAR INT = 2012 
DECLARE @Graceperiod INT = 2 

SELECT 
     [Construct Date] = DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1) --construct date 
     ,[Add Grace period] =DATEADD(mm,@Graceperiod,DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1)) --add grace month 
     ,[DateDiff] = DATEDIFF(
         DAY, 
         DATEADD(mm,@Graceperiod,DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1)), 
         GETDATE() 
       ) -- datediff 
0

你在做同样的计算三次,尝试使用此方法保存

DECLARE @Month INT = 11 
DECLARE @YEAR INT = 2012 
DECLARE @Graceperiod INT = 2 

-- This is that calculation 
DECLARE @ConstructInitialDate DATETIME = DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 , DAY(GETDATE()) - 1) 

SELECT 
    [Construct Initial Date] = @ConstructInitialDate --construct initial date 
    ,[Add Grace period] =DATEADD(mm, @Graceperiod, @ConstructInitialDate) --add grace month 
    ,[DateDiff] = DATEDIFF 
(
    DAY, 
    DATEADD(mm,@Graceperiod, @ConstructInitialDate), 
    GETDATE() 
) 
+2

重点仅在[DateDiff]字段,而不是其他字段。我所展示的其他领域只是为了逐步展示我已经解决了这个问题。 –

1

试试这个:

DECLARE @Month INT = 11 
DECLARE @YEAR INT = 2012 
DECLARE @Graceperiod INT = 2 

SELECT DATEADD(mm,(@month-month(getdate())),DATEADD(year,@year-YEAR(getdate()),getdate())) as InitialDate, 
     DATEADD(mm,@Graceperiod,DATEADD(mm,(@month-month(getdate())),DATEADD(year,@year-YEAR(getdate()),getdate()))) as GraceDate, 
     DATEDIFF(day,DATEADD(mm,@Graceperiod,DATEADD(mm,(@month-month(getdate())),DATEADD(year,@year-YEAR(getdate()),getdate()))),GETDATE()) as DateDiffs 
+0

先生,您能否提供解决方案而无需铸造 –

+0

其更新信息见答案 – AnandPhadke

1

试试这个:

这可能不会给出任何性能的改善,我认为,但减少了你的代码的一点点

DECLARE @Month INT = 11 
DECLARE @YEAR INT = 2012 
DECLARE @Graceperiod INT = 2 

;with cte as (select DATEADD(mm, (@YEAR - 1900) * 12 + @Month - 1 ,0) as begining_month) 
select DATEADD(dd,DAY(GETDATE()) - 1,begining_month) as [Construct Initial Date], 
     DATEADD(mm,@Graceperiod,DATEADD(dd,DAY(GETDATE()) - 1,begining_month)) as [Add Grace period] , 
     DATEDIFF(DAY,DATEADD(mm,@Graceperiod,DATEADD(dd,DAY(GETDATE()) - 1,begining_month)), GETDATE()) as [DateDiff] 
from cte