【问题标题】:SQL - DATEDIFF with a subquerySQL - 带有子查询的 DATEDIFF
【发布时间】:2015-05-28 12:07:22
【问题描述】:

我需要从SQL Server DB 向下游传递一个值,这本质上是两个timestamps 之间的差异。使用DATEDIFF 函数就足够简单了。

SELECT DATEDIFF(day, '2015-11-06 00:00:00.000','2015-12-25 00:00:00.000') AS DiffDate ;

但是,在将值向下传递时,代码只知道订单 ID 值,而不知道上面显示的 2 个时间戳。因此,我需要 timestamp 信息来自子查询,或者我认为的其他信息。子查询的主要细节在这里:

select O.DATE1 , C.DATE2
from TABLE1 O, TABLE2 C
WHERE O.VALUE1_ID = C.VALUE1
AND O.order_id = '12345678' 

我尝试了几种不同的方法,但都没有成功。我厌倦的最新消息如下,从语法的角度来看,它看起来不错,但我得到了错误:

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

我不太确定如何应对或处理。

select DATEDIFF (day,'(select O.VALUE1 
from TABLE1 O 
where O.VALUE1 = 16650476)' , 
               '(SELECT C.VALUE1 
                 from TABLE1 O, TABLE2 C 
                 WHERE O.VALUE1 = C.VALUE2 AND O.order_id = 12345678)') AS DIFFDATE; 

任何指针或帮助将不胜感激。

【问题讨论】:

  • 请使用示例数据和所需结果编辑您的问题。您的代码示例确实无助于传达您正在尝试做的事情。
  • .. 最好对样本数据使用 ddl + dml 语句,以便我们可以fiddle它。

标签: sql sql-server datediff


【解决方案1】:

子查询不应该是字符串,所以去掉单引号。另外,您谈论的是 O.DATE1 和 C.DATE2,所以您的意思可能是这样的:

select DATEDIFF (day, 
              (select O.DATE1 
                 from TABLE1 O 
                where O.VALUE1 = 16650476) , 
              (SELECT C.DATE2 
                from TABLE1 O, TABLE2 C 
                WHERE O.VALUE1 = C.VALUE2 AND O.order_id = 12345678)) AS DIFFDATE; 

【讨论】:

    【解决方案2】:

    我认为您想要以下内容:

    SELECT DATEDIFF(DAY, cj.SomeDateColumn, C.SomeDateColumn)
    FROM TABLE1 O 
    JOIN  TABLE2 C  ON O.VALUE1 = C.VALUE2
    CROSS JOIN (SELECT O.SomeDateColumn FROM TABLE1 WHERE order_id = 16650476) cj
    WHERE  O.order_id = 12345678
    

    【讨论】:

    • 大家好,感谢所有反馈,如果我不清楚,请向某些人道歉,Klas 指出了一些非常明显的问题,它似乎已经解决了我的问题。
    【解决方案3】:

    你能不能先声明两个 datetime 变量,然后对这两个变量进行 datediff 呢?

    DECLARE @FirstDate AS datetime
    DECLARE @SecondDate AS datetime
    SET @FirstDate = (select O.VALUE1 from TABLE1 O where O.VALUE1 = 16650476)
    SET @SecondDate = (SELECT C.VALUE1 from TABLE1 O, TABLE2 C WHERE O.VALUE1 = C.VALUE2 AND O.order_id = 12345678)
    SELECT DATEDIFF(day, @FirstDate, @SecondDate)
    

    【讨论】:

      【解决方案4】:

      您可以尝试以下我使用了您的子查询,但是有关“Table1”和“Table2”表中数据的更多信息会很有用

      SELECT
          DATEDIFF(day, D.Date1, D.Date2) AS DiffDate 
      FROM
      (
          select O.DATE1 as Date1 , C.DATE2 as Date2
          from TABLE1 O, TABLE2 C
          WHERE O.VALUE1_ID = C.VALUE1
          AND O.order_id = '12345678' 
      ) D
      

      您收到错误的原因

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

      是因为您将字符串(如下)传递给 datediff 函数而不是使用日期

      '(select O.VALUE1 
      from TABLE1 O 
      where O.VALUE1 = 16650476)'
      

      【讨论】:

        猜你喜欢
        • 2018-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多