Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 构造查询的更好方法_Sql_Sql Server 2008 - Fatal编程技术网

Sql 构造查询的更好方法

Sql 构造查询的更好方法,sql,sql-server-2008,Sql,Sql Server 2008,输入: 月、年、月。都是整数 我们需要做什么? 首先需要从月、年和日构造日期(需要从当前日期获取) 然后添加GraceMonth。添加GraceMonth后,我们将得到新的日期。 接下来,从构建的日期开始,我们需要将其与当前日期进行比较 你试过什么? e、 g.(我正在部分展示) 结果 Construct Initial Date Add Grace period DateDiff 2012-11-14 00:00:00.000 2013-01

输入:

月、年、月。
都是整数

我们需要做什么?

首先需要从月、年和日构造日期(需要从当前日期获取) 然后添加GraceMonth。添加GraceMonth后,我们将得到新的日期。 接下来,从构建的日期开始,我们需要将其与当前日期进行比较

你试过什么?

e、 g.(我正在部分展示)

结果

Construct Initial Date        Add Grace period              DateDiff
2012-11-14 00:00:00.000       2013-01-14 00:00:00.000      -122
如果你的答案是正确的,那么你在寻找什么?

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


提前感谢。

您做了三次相同的计算,请尝试此操作以保存该计算

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()
)
试试这个:

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
试试这个:

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
我认为这可能不会提高性能,但会减少一点点代码

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

第一个观察是-为什么不将
@Month
@Graceperiod
一起添加,而不是与他们进行两次单独的
DATEADD(Month…
调用?先生,我在[Datediff]列中根据您的建议进行了更新,您能提供解决方案而不将重点放在[Datediff]上吗字段,而不是其他字段。我显示的其他字段只是为了逐步显示我是如何解决问题的。
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