【问题标题】:How to Subtract day on date-time column - SQL Server 2008如何在日期时间列上减去天数 - SQL Server 2008
【发布时间】:2018-10-03 14:43:02
【问题描述】:

我有两列 YYYY MM DD MM SS 格式,我想减去这两列之间的天数 (DD)

201810031030 YYYY MM DD MM SS - 201810051030 YYYY MM DD MM SS  = 3(03-05)

我有一个 SQL 函数,可以将 MM 月转换为字符串(即一月)。

任何建议都非常感谢

下面是 SQL 和我得到的错误:

DATEDIFF(DAY, CAST(IST COLUMN) AS DATETIME), CAST (2ND COLUMN) AS DATETIME))

从字符串转换日期和/或时间时转换失败

目前的数据类型是VARCHAR (201810031030),我想即时转换它

【问题讨论】:

  • 如果你有日期时间数据,你真的应该使用正确的数据类型来存储它——DATE、TIME、DATETIME 等。这样做,你所有的日期时间操作问题都会变得非常简单解决。
  • 它们真的是空间分隔的吗?
  • @Salman 完全同意我一定忽略了数据类型。

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以使用 DateDiff 函数:

datediff(day,column1,column2)

【讨论】:

    【解决方案2】:

    最佳解决方案是使用正确的数据类型 (datetime) 更改您的数据库结构。

    如果这不可行,您可以使用stuff 构建标准的datetime 格式,然后将cast 转换为datetime。然后你可以使用datediff 计算天差:

    declare @tmp table (date_1 varchar(50), date_2 varchar(50))
    
    insert into @tmp values ('201810031030','201810051030')
    
    select 
         cast(stuff(stuff(date_1, 11,0,':') + ':00', 9,0,' ') as datetime) as date_1
        ,cast(stuff(stuff(date_2, 11,0,':') + ':00', 9,0,' ') as datetime) as date_2
    
        ,DATEDIFF(
            day,
            cast(stuff(stuff(date_1, 11,0,':') + ':00', 9,0,' ') as datetime),
            cast(stuff(stuff(date_2, 11,0,':') + ':00', 9,0,' ') as datetime)
        ) + 1 as diff
    from @tmp
    

    结果:

    【讨论】:

      【解决方案3】:

      基本上你需要做这样的事情来保持它非常标准和简单。从数据库的角度来看,这基本上是一种不好的做法,但这种格式的数据可能存在合法需求,所以我不是一个判断的人。这应该会为您提供每次执行所需的内容:

      DECLARE @oddDTFormat1 AS CHAR(12);
      DECLARE @oddDTFormat2 AS CHAR(12);
      DECLARE @newDTFormat1 AS DATETIME;
      DECLARE @newDTFormat2 AS DATETIME;
      
      SET @oddDTFormat1 = '201809010030';
      SET @oddDTFormat2 = '201809031037';
      
      
      SET @newDTFormat1 = CONVERT(DATETIME, LEFT(@oddDTFormat1, 8), 112) + CONVERT(DATETIME, CONCAT(SUBSTRING(@oddDTFormat1, 9, 2), ':', SUBSTRING(@oddDTFormat1, 11, 2)), 114);
      
      SET @newDTFormat2 = CONVERT(DATETIME, LEFT(@oddDTFormat2, 8), 112) + CONVERT(DATETIME, CONCAT(SUBSTRING(@oddDTFormat2, 9, 2), ':', SUBSTRING(@oddDTFormat2, 11, 2)), 114);
      
      SELECT DATEDIFF(DAY, @newDTFormat1, @newDTFormat2);
      

      谢谢, 戴夫·贝图内 PV9685

      【讨论】:

      • 请原谅我格式化这台机器的代码不是为 SQL 设置的,所以我在浏览器中工作并使用 Web 工具进行验证。 ;)
      • 此外,如果您关心此代码的性能、可靠性和准确性,并计划在未来几年对您的日期/时间数据执行操作,您可能会想要创建一个新表和使用我提供的代码来创建一个 DATETIME 数据表。要支持遗留代码,请使用视图之类的东西将 DATETIME 转换为您当前使用的专有格式。如果这是一家规模相当大的企业的一部分,那么明智的做法是在数据库变得更加复杂之前或在员工变化和混乱出现多年之后这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多