【问题标题】:Subtract substring days from date从日期中减去子字符串天数
【发布时间】:2018-10-23 19:33:30
【问题描述】:

我试图提出一个Select 语句,它将返回DATE 列减去DAYS 列中的天数。

这是我尝试过的查询:

SELECT 
    DATEADD(DAY, -+(REPLACE(ISNULL(DAYS,0), 'DAYS', '')), DATE) 
FROM
    T

会报错

操作数数据类型 varchar 对减号运算符无效

【问题讨论】:

标签: sql sql-server datetime


【解决方案1】:
dateadd(day, -1*convert(int, coalesce(replace([DAYS], ' days', ''),'0')), [DATE])

【讨论】:

    【解决方案2】:

    类似

    DECLARE
           @Days VARCHAR(25) = '23 DAYS',
           @Date DATE = '2018-10-23';
    
    SELECT DATEADD(Day, - CAST(REPLACE(@Days , 'DAYS', '') AS INT), @Date )
    

    如果您使用的是 SQL Server 2012+

    SELECT DATEADD(Day, - ISNULL(TRY_CAST(REPLACE(@Days , 'DAYS', '') AS INT), 0), @Date )
    

    【讨论】:

      【解决方案3】:

      我认为您需要获取数字,将其转换为整数作为负数并使用 dateadd,如下所示:

      SELECT dateadd(DAY,cast('-'+substring([DAYS], 1,charindex(' ',[DAYS])) as int),[DATE])
      FROM T
      

      【讨论】:

        【解决方案4】:

        你可以用这个:

        使用CHARINDEX 获取天数并转换为int 然后minus它来自date

        select DATEADD(DAY,-CAST(SUBSTRING(days,1,CHARINDEX(' ',days)) AS INT),DATE),* from #table
        

        【讨论】:

          【解决方案5】:

          DATEADD 函数的第二个参数参数需要一个整数。

          通过将“DAYS”替换为空字符串,您仍然会得到一个varchar,其中包含一个数字以及该数字与单词“DAYS”之间的空格。

          RTRIM 这个结果和CAST 它是一个Integer,你应该很高兴。

          哦,您还需要将,DATE 放在DATEADD() 的括号内。

          猜你喜欢
          • 1970-01-01
          • 2019-05-14
          • 1970-01-01
          • 2012-10-07
          • 1970-01-01
          • 1970-01-01
          • 2013-02-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多