none
如何设置一个@变量,来取代sql的某个字段 RRS feed

  • 问题

  • 合同表(ContractTable)中有合同起始日(LeaseDateFrom)和合同终止日(LeaseDateTo)。一般来说合同期限整年整年的,那么LeaseDateFrom和 LeaseDateTo之间的日期相差1年、2年、3年。。。。。。
    现在出现了特殊情况,LeaseDateFrom是2017-5-1,LeaseDataTo是2018-12-31,相差不是整年。
    我希望如果两个日期相差不是整年的时候,设置个@time代替LeaseDateFrom,让这个@time增加到和LeaseDateTo保持相差是整年的关系。
    也就是我把上面的LeaseDateFrom (2017-5-1)用变量@time代替。@time的值为2017-1-1,这样@time和 LeaseDateTo之间相差正好又是整年了,之后就用@time取代LeaseDateFrom进行运算。
    请问大家,该怎么做呢?

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。

    2017年12月25日 12:49

全部回复

  • declare @LeaseDateTo='2018-12-31'

    declare @time datetime='2017-5-1'

    declare @monthdiff int

    declare  @LeaseDateFrom datetime

    SELECT  @monthdiff=datediff( month ,@datetime, @LeaseDateTo )

    if(@monthdiff<=12)

        set @LeaseDateFrom='2017-1-1'

    换做C#计算,两个日期相减得到TimeSpan类型,查看它的值,再与整年(12个月)做比较,求余数。

    datediff 参考

    -- http://www.cnblogs.com/yinluhui0229/archive/2012/07/09/2583770.html



    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年12月26日 0:49
  • 看你的意思,就是整年的话,保持原值不变,如果不是整年,则显示一个计算的整年值

    这个在查询的时候用 case when 处理一下就行,用变量来代替就没太明白是什么意思了

    2017年12月26日 1:10
  • SELECT
    	LeaseDateFrom = DATEADD(DAY, 1, DATEADD(Year, -(DATEDIFF(Year, LeaseDateFrom, LeaseDataTo)+1), LeaseDataTo)),
    	LeaseDataTo
    FROM(
    	SELECT LeaseDateFrom = '2017-5-1', LeaseDataTo = '2018-12-31'
    ) ContractTable

    2017年12月26日 1:16
  • 抱歉我之前没有说得很清楚,这里做些补充:

    图1中我没有用变量,直接设置了一个列名“time1”,这个time1正是我所需的 那个经过转换的日期,可是我并不能把time1象变量或字段那样直接在 SQL中使用,否则就会出现图1中所示错误:“列名time1无效”,。

    因此,我希望把time1像变量一样地使用,不用每次都case 一大串的判断,该如何修正呢?

    ================图1=======================

    select 
    (case 
    when DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo))%12 =0
    then LeaseDateFrom
    else DATEADD(YEAR,-(DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo))/12+1),DATEADD(DAY,1,LeaseDateTo)) 
    end) as time1
    
    ,LeaseDateFrom 
    ,LeaseDateTo
    ,DATEDIFF (MONTH,time1,DATEADD(day,1,LeaseDateTo)) as 'time1到LeaseDateTo的月份'
    ,DATEDIFF (MONTH,LeaseDateFrom,DATEADD(day,1,LeaseDateTo)) as 'LeaseDateFrom到LeaseDateTo的月份'
    
    from ContractTable


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。

    2017年12月26日 7:00
  • 在另外一个帖子中已经回复。

    family as water

    2017年12月27日 0:51
  • 子查询嵌套查询,或者是在表上加计算列,或者是套个视图

    变量是没法弄的,在 SQL Sserver 中, 变量赋值和查询不能同时用(mysql 倒是支持)

    SELECT
    	(CASE 
    		WHEN [LeaseDateFrom到LeaseDateTo的月份] % 12 = 0 THEN LeaseDateFrom 
    		ELSE DATEADD(YEAR, -([LeaseDateFrom到LeaseDateTo的月份] / 12 + 1), _LeaseDateTo_1) 
    	END) AS time1,
    	LeaseDateFrom, LeaseDateTo,
    	[time1到LeaseDateTo的月份], [LeaseDateFrom到LeaseDateTo的月份]
    FROM(
    	SELECT *,
    		DATEDIFF(MONTH, time1, _LeaseDateTo_1) AS  'time1到LeaseDateTo的月份',
    		DATEDIFF(MONTH, LeaseDateFrom, _LeaseDateTo_1) AS  'LeaseDateFrom到LeaseDateTo的月份'
    	FROM(
    		SELECT *,
    			DATEADD(day, 1, LeaseDateTo) as _LeaseDateTo_1
    		FROM ContractTable
    	)A
    ) B
    
    

    2017年12月27日 1:22