【问题标题】:datediff(MINUTE,[End Time],[Start Time])datediff(MINUTE,[结束时间],[开始时间])
【发布时间】:2016-09-29 11:03:05
【问题描述】:

当我在下面运行查询时:

select datediff(MINUTE,[End Time],[Start Time]) 
from [LINKEDAF].[PRD Project].[Data].[EFAN1]

它给出错误信息:

消息 241,第 16 级,状态 1,第 20 行 从字符串转换日期和/或时间时转换失败。

我用 cast 和 convert 尝试了几件事,但同样的问题:

select datediff(MINUTE,convert(varchar(24),[End Time],120),convert(varchar(24),[End Time],120)) 
from [LINKEDAF].[PRD Project].[Data].[EFAN1]

select datediff(MINUTE,cast([End Time] as datetime),cast([End Time] as datetime)) 
from [LINKEDAF].[PRD Project].[Data].[EFAN1]

提前致谢!

【问题讨论】:

  • [End Time][Start Time]的数据类型是什么,其中存在什么样的数据
  • 结束时间 开始时间 09/09/2016 10:51:46 09/09/2016 10:50:38 09/09/2016 10:51:46 09/09/2016 10:50 :38 09/09/2016 10:49:21 09/09/2016 10:44:58
  • 嗨,托尼,请提供一些超过 12 天的示例。这些值可能是 dd/mm 或 mm/dd。
  • 格式为:09/09/2016 10:51:46
  • Tony, 09/09/2016 可以是 DD/MM/YYYY 以及 MM/DD/YYYY ...

标签: sql sql-server


【解决方案1】:

要进行 datediff,您必须有 2 个日期或日期时间值。要将字符串转换为日期或日期时间,您应该使用

CONVERT(date[time], 'yourdata', FORMAT)

格式请看https://msdn.microsoft.com/de-de/library/ms187928.aspx

【讨论】:

    【解决方案2】:

    你正在使用这个

    convert(varchar(24),[End Time],120)
    

    虽然120 的格式意味着:yyyy-mm-dd hh:mi:ss(24h)

    在您声明的 cmets 中,实际格式为 DD/MM/YYYY HH:MM:SS

    因此,您可以尝试使用131 或尝试使用LEFT()RIGHT() 分割您的值,使用103 分配日期,使用108 分配时间。查找Details here

    而且你想转换成datetime,所以你应该使用

    convert(datetime,[End Time],131)   
    

    更新示例

    这样试试

    DECLARE @tbl TABLE(YourValues VARCHAR(100));
    INSERT INTO @tbl VALUES('09/09/2016 10:51:46'),('09/09/2016 10:50:38'),('09/09/2016 10:51:46')
                          ,('09/09/2016 10:50:38'),('09/09/2016 10:49:21'),('09/09/2016 10:44:58');
    
    --This works
    SELECT CONVERT(datetime,YourValues,131)
    FROM @tbl
    
    --And this too
    SELECT CONVERT(DATETIME,LEFT(YourValues,10),103)+CONVERT(DATETIME,RIGHT(YourValues,8),108)
    FROM @tbl
    

    如果这对您没有帮助,请告诉我们您认为您看到的内容,而不是真实存在的内容...

    【讨论】:

    • 这个不行:select datediff(MINUTE,convert(datetime,[End Time],131), convert(datetime,[Start Time],131) ) from [LINKEDAF].[ PRD Project].[Data].[EFAN1] 使用 LEFT() 和 RIGHT() 的完整查询是什么
    • 这个不行:select convert(datetime,right([End Time],108)+left([End Time],103)) from [LINKEDAF].[PRD Project]。 [数据].[EFAN1]
    • Shnugo,不明白为什么,但也不起作用:SELECT CONVERT(DATETIME,LEFT([End Time],10),103)+CONVERT(DATETIME,RIGHT([End Time] ],8),108) 来自 [LINKEDAF].[PRD 项目].[数据].[EFAN1]
    • 嗨@Tony,如果你遇到错误,你应该尝试小步走……而不是你的全选,试试SELECT CONVERT(DATETIME,[End Time],131) FROM [LINKEDAF].[PRD Project].[Data].[EFAN1]。与[Start Time] 相同...如果这不会导致有效日期列表,请直接 选择这些列并仔细查看值。有时像31/06/2016 这样的值根本不存在......或者有其他无效值......字符串列中可能有任何东西......检查源值!
    【解决方案3】:

    首先尝试在该值上使用ISDATE

    如果表达式是有效的日期、时间或日期时间值,则返回 1;否则为 0。

    如果表达式是 datetime2 值,则 ISDATE 返回 0。

    看看这个查询会返回什么:

    SELECT  [End Time],
            [Start Time] 
    FROM [LINKEDAF].[PRD Project].[Data].[EFAN1]
    WHERE ISDATE([End Time]) = 0 OR ISDATE([Start Time]) = 0
    

    在发布结果之后,可能有一些日期 SQL 无法正确解析,或者有datetime2 格式。

    如果我将 varchar 与您提供的值一起使用 - 我会得到结果:

    ;WITH YourTable AS (
    SELECT *
    FROM (VALUES
    ('09/09/2016 10:51:46', '09/09/2016 10:50:38'),
    ('09/09/2016 10:49:21', '09/09/2016 10:44:58')
    ) as t([Start Time], [End Time])
    )
    
    SELECT DATEDIFF(MINUTE,[Start Time],[End Time])
    FROM YourTable
    

    给予:

    -1
    -5
    

    【讨论】:

    • 你检查过 ISDATE 吗?
    • 我对其进行了测试,它提供了一些数据,但由于我从不同的表中获取了日期格式列,因此我没有进一步了解,但感谢您的所有努力。
    • 是的,感谢 orig 日期格式列 datediff 工作正常。
    【解决方案4】:

    如果您使用的是 SQL Server 2012 或更高版本,请尝试以下脚本。

    SELECT datediff(MINUTE,cast([EndTime] as datetime),cast([StartTime] as datetime)) 
    FROM YourTable
    WHERE TRY_CONVERT(DATETIME,[EndTime]) IS NOT NULL AND TRY_CONVERT(DATETIME,[StartTime])  IS NOT NULL
    

    这是一个示例场景。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2021-02-23
      • 2016-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      相关资源
      最近更新 更多