从字符串转换为 datetime 时发生语法错误。

nanjg 2014-06-10 05:53:02
select 
sum(case when datediff(n,b.rjsj,b.cjsj)>120 then 1
when datediff(n,b.rjsj,b.cjsj)>480 and datediff(hour,b.rjsj,b.cjsj)<600 then 1.5
when datediff(n,b.rjsj,b.cjsj)>600 then 2
else 0
end)as 下井次数
from ry_day_info a left join rk_day_info b
on a.name=b.xm and datediff(day,a.rjsj,b.rjsj)=0


b.rjsj,b.cjsj都 是 varchar()形式 如何在这种形式下 用datediff函数 减法2个表示 日期的数值?
...全文
360 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanjg 2014-06-18
  • 打赏
  • 举报
回复
引用 13 楼 xxzxwsx 的回复:
貌似语句还可以简化一下

select 
sum(case when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>600 then 2
         when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>480  then 1.5
         when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>120 then 1
         else 0
    end)as 下井次数
from ry_day_info a left join rk_day_info b
  on a.name=b.xm and datediff(day, cast(a.rjsj as datetime), cast(b.rjsj as datetime))=0
你这个简化 好
在路上_- 2014-06-11
  • 打赏
  • 举报
回复
貌似语句还可以简化一下

select 
sum(case when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>600 then 2
         when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>480  then 1.5
         when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>120 then 1
         else 0
    end)as 下井次数
from ry_day_info a left join rk_day_info b
  on a.name=b.xm and datediff(day, cast(a.rjsj as datetime), cast(b.rjsj as datetime))=0
在路上_- 2014-06-11
  • 打赏
  • 举报
回复
试试这个

select 
sum(case when datediff(n, cast(b.rjsj as datetime),cast(b.cjsj as datetime))>120 then 1
         when datediff(n,cast(b.rjsj as datetime),cast(b.cjsj as datetime))>480 and datediff(hour,cast(b.rjsj as datetime),cast(b.cjsj as datetime))<600 then 1.5
         when datediff(n,cast(b.rjsj as datetime),cast(b.cjsj as datetime))>600 then 2
         else 0
    end)as 下井次数
from ry_day_info a left join rk_day_info b
on a.name=b.xm and datediff(day,cast(a.rjsj as datetime),cast(b.rjsj as datetime))=0
chen357313771 2014-06-11
  • 打赏
  • 举报
回复
首先看一下你这两个字段的数据类型是否是datetime类型,如果不是 SELECT * FROM ( SELECT ISDATE(a.rjsj) AS dateChk FROM ry_day_info  ) a WHERE a.dateChk=0 查一下是否存在非日期格式的数据,然后你就知道哪错了。
xiaoxiangqing 2014-06-11
  • 打赏
  • 举报
回复
应该不符合日期格式
nanjg 2014-06-11
  • 打赏
  • 举报
回复

select 
sum(case 
      when datediff(n, convert(varchar,cast(b.rjsj as datetime),120) ,convert(varchar,cast(b.cjsj as datetime),120) )>120 then 1
 else 0
    end)as 下井次数
from ry_day_info a left join rk_day_info b
on a.name=b.xm and datediff(day,cast(a.rjsj as datetime),cast(b.rjsj as datetime))=0
这样也不中 报错

服务器: 消息 241,级别 16,状态 1,行 1
从字符串转换为 datetime 时发生语法错误。

rjsj 例如2014-01-02 15:01:02.000 cjsj例如 2014-01-02 23:01:02.001
在路上_- 2014-06-11
  • 打赏
  • 举报
回复
这里你没改呀: and datediff(hour,b.rjsj,b.cjsj)<600 then 1.5
發糞塗牆 2014-06-11
  • 打赏
  • 举报
回复
用isdate()判断是否能转换成日期类型,然后用convert统一格式 http://blog.csdn.net/dba_huangzj/article/details/7657979
nanjg 2014-06-11
  • 打赏
  • 举报
回复

select 
sum(case when datediff(n,b.rjsj,b.cjsj)>120 then 1
         when datediff(n,b.rjsj,b.cjsj)>480 and datediff(hour,b.rjsj,b.cjsj)<600 then 1.5
         when datediff(n,b.rjsj,b.cjsj)>600 then 2
         else 0
    end)as 下井次数
from ry_day_info a left join rk_day_info b
on a.name='李*'and b.xm='李*' and datediff(day,a.rjsj,b.rjsj)=0

把 数据库字段改为 datetime了 散了。
在路上_- 2014-06-11
  • 打赏
  • 举报
回复
引用 11 楼 chen357313771 的回复:
首先看一下你这两个字段的数据类型是否是datetime类型,如果不是 SELECT * FROM ( SELECT ISDATE(a.rjsj) AS dateChk FROM ry_day_info  ) a WHERE a.dateChk=0 查一下是否存在非日期格式的数据,然后你就知道哪错了。
楼主照着做一下了,找出格式不符的记录。 刚才才试出来,格式不符时,2008报“转换失败”,2000竟然报“语法错误”,太误导人
chen357313771 2014-06-11
  • 打赏
  • 举报
回复
引用 16 楼 nanjg 的回复:
[quote=引用 11 楼 chen357313771 的回复:] 首先看一下你这两个字段的数据类型是否是datetime类型,如果不是 SELECT * FROM ( SELECT ISDATE(a.rjsj) AS dateChk FROM ry_day_info  ) a WHERE a.dateChk=0 查一下是否存在非日期格式的数据,然后你就知道哪错了。
两个字段都是varchar型式的 不能直接用 cast么 [/quote]varchar类型报错证明你的字段有非日期格式的数据,所以你的语句报错,有两种方案,一统一数据,二在查询语句中先排除非日期格式的数据
在路上_- 2014-06-11
  • 打赏
  • 举报
回复

select datediff(n,
  cast('2014-01-02 15:01:02.000' as datetime),
  cast('2014-01-02 23:01:02.001' as datetime)
) as 井下时间

/*--结果--
井下时间
---------
480
---------*/
nanjg 2014-06-11
  • 打赏
  • 举报
回复
引用 11 楼 chen357313771 的回复:
首先看一下你这两个字段的数据类型是否是datetime类型,如果不是 SELECT * FROM ( SELECT ISDATE(a.rjsj) AS dateChk FROM ry_day_info  ) a WHERE a.dateChk=0 查一下是否存在非日期格式的数据,然后你就知道哪错了。
两个字段都是varchar型式的 不能直接用 cast么
nanjg 2014-06-11
  • 打赏
  • 举报
回复
引用 13 楼 xxzxwsx 的回复:
貌似语句还可以简化一下

select 
sum(case when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>600 then 2
         when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>480  then 1.5
         when datediff(n, cast(b.rjsj as datetime), cast(b.cjsj as datetime))>120 then 1
         else 0
    end)as 下井次数
from ry_day_info a left join rk_day_info b
  on a.name=b.xm and datediff(day, cast(a.rjsj as datetime), cast(b.rjsj as datetime))=0
我试了 可是还是报错啊

服务器: 消息 241,级别 16,状态 1,行 1
从字符串转换为 datetime 时发生语法错误
  • 打赏
  • 举报
回复
日期做差可以,但是字符串不行,首先需要通过cast转化为datetime类型。
nanjg 2014-06-10
  • 打赏
  • 举报
回复
rjsj 例如2014-01-02 15:01:02.000 cjsj例如 2014-01-02 23:01:02.001
--小F-- 2014-06-10
  • 打赏
  • 举报
回复
rjsj这些字段估计不能直接转换成DATETIME类型的 你可以试试用字段拼接。 给出你rjsj的字段数据来看看。
习惯性蹭分 2014-06-10
  • 打赏
  • 举报
回复
貼出你的一些rjsj和cjsj數據
nanjg 2014-06-10
  • 打赏
  • 举报
回复
select 
sum(case when datediff(n, cast(b.rjsj as datetime),cast(b.cjsj as datetime))>120 then 1
         when datediff(n,cast(b.rjsj as datetime),cast(b.cjsj as datetime))>480 and datediff(hour,b.rjsj,b.cjsj)<600 then 1.5
         when datediff(n,cast(b.rjsj as datetime),cast(b.cjsj as datetime))>600 then 2
         else 0
    end)as 下井次数
from ry_day_info a left join rk_day_info b
on a.name=b.xm and datediff(day,cast(a.rjsj as datetime),cast(b.rjsj as datetime))=0
服务器: 消息 241,级别 16,状态 1,行 1 从字符串转换为 datetime 时发生语法错误。
在路上_- 2014-06-10
  • 打赏
  • 举报
回复
datediff(n,cast(b.rjsj as datetime),cast(b.cjsj as datetime))
加载更多回复(1)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧