請教SQL 語句.
select top 1000 卡號,
早上=(
select max(cdate) from cardmemo
where cardID=V_考勤時間表.卡號 and
cdate between datediff(mi,V_考勤時間表.有效時長,V_考勤時間表.早上上班) and datediff(mi,-V_考勤時間表.有效時長,V_考勤時間表.早上上班) )
from V_考勤時間表
以上語句返回如下錯誤
Server: Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type datetime.
但我把 and
cdate between datediff(mi,V_考勤時間表.有效時長,V_考勤時間表.早上上班) and datediff(mi,-V_考勤時間表.有效時長,V_考勤時間表.早上上班)
條件去掉就可以檢索出數據.
问题点数:20、回复次数:18Top
1 楼txlicenhe(马可)回复于 2003-12-04 09:58:36 得分 0
是不是数据太大,超出了整型数据的范围?
Top
2 楼txlicenhe(马可)回复于 2003-12-04 10:00:42 得分 0
select datediff(ss,'1999-01-01','2050-01-01')
-----------
1609459200
(所影响的行数为 1 行)
select datediff(ss,'1999-01-01','2550-01-01')
服务器: 消息 535,级别 16,状态 1,行 1
Difference of two datetime columns caused overflow at runtime.Top
3 楼BenyMo(BenyMo)回复于 2003-12-04 10:05:18 得分 0
马可:
是什么意思呀?Top
4 楼BenyMo(BenyMo)回复于 2003-12-04 10:06:47 得分 0
我最大的日期是 2012/11/9Top
5 楼IceRiver_11(iceriver)回复于 2003-12-04 10:21:28 得分 0
看错误提示是类型转换失败导致的错误,检查您的要转换成日期型的字段的取值吧!Top
6 楼BenyMo(BenyMo)回复于 2003-12-04 10:26:57 得分 0
以下是V_考勤時間表的視圖語句.
請問
早上上班=CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間1, 108),
這個早上上班得出的是dateTime 類型嗎?
------------------------------------------------
CREATE VIEW dbo.V_考勤時間表
AS
SELECT dbo.RSZLB.卡號,dbo.日期.日期,
早上上班=CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間1, 108),
早上下班=CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間2, 108),
下午上班=CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間3, 108),
下午下班=CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間4, 108),
4 as 刷卡次數,有效時長
FROM dbo.時間表 CROSS JOIN
dbo.日期 CROSS JOIN
dbo.RSZLBTop
7 楼suzh1133(suzh)回复于 2003-12-04 10:30:59 得分 0
看提示应该是datediff(mi,V_考勤時間表.有效時長,V_考勤時間表.早上上班)转化时出错了,你可以单独测试一下这个时间转换是否有问题Top
8 楼LoveSQL(努力奋斗ing)回复于 2003-12-04 10:39:14 得分 0
V_考勤時間表.有效時長 和
V_考勤時間表.早上上班
都应该是datetime 类型。
而你的错误提示好像是这两个字段有的不是datetime 类型,在转换的过程中出错了。
你检查一下你的字段类型吧。。。。。Top
9 楼BenyMo(BenyMo)回复于 2003-12-04 10:43:17 得分 0
字段類型我估計是沒問的題的我把
V_考勤時間表 的SQL 改成
CREATE VIEW dbo.V_考勤時間表
AS
SELECT dbo.RSZLB.卡號,dbo.日期.日期,
早上上班=cast(CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間1, 108) as datetime),
早上下班=cast(CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間2, 108) as datetime),
下午上班=cast (CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間3, 108) as datetime),
下午下班=cast(CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間4, 108) as datetime),
4 as 刷卡次數,有效時長
FROM dbo.時間表 CROSS JOIN
dbo.日期 CROSS JOIN
dbo.RSZLB
Top
10 楼LoveSQL(努力奋斗ing)回复于 2003-12-04 10:43:58 得分 0
以下是V_考勤時間表的視圖語句.
請問
早上上班=CONVERT(char(11), 日期, 120) +' ' +CONVERT(char(8),時間1, 108),
這個早上上班得出的是dateTime 類型嗎?
------------------------------------------------
你这样的转换肯定是不对的。。。
试试---
select convert(varchar(10),'2003-01-01')+' '+convert(varchar(10),'12:12:23') as testdate
这个例子就是转换成datetime类型的
你可以照这个改一下你的程序
Top
11 楼BenyMo(BenyMo)回复于 2003-12-04 10:54:18 得分 0
問題仍未解決.請各位出手邦助Top
12 楼BenyMo(BenyMo)回复于 2003-12-04 11:07:54 得分 0
檢查過了 早上上班 與 cdate 都是時間日期型的Top
13 楼hglhyy(為人民币服务!)回复于 2003-12-04 11:22:02 得分 0
一个建议:
请以后用简体中文,繁体的看起来好累!!
Top
14 楼hglhyy(為人民币服务!)回复于 2003-12-04 11:31:43 得分 0
把下面的试下
select max(cdate) from cardmemo
where cardID=a.卡號 and
cdate between datediff(mi,a.有效時長,a.早上上班) and datediff(mi,-a.有效時長,a.早上上班)
ps: 有效時長 and 早上上班 字段的类型! 都是datetime吗?长度够不?
Top
15 楼BenyMo(BenyMo)回复于 2003-12-05 16:35:55 得分 0
我也希望用簡體.但本人的系統是繁體2000Top
16 楼teaism()回复于 2003-12-05 17:04:19 得分 20
你用错函数了吧!有效時長可能是个数值型.所以才超出范围!
可能要用DATEADD()
select max(cdate) from cardmemo
where cardID=V_考勤時間表.卡號 and
cdate between dateADD(mi,V_考勤時間表.有效時長,V_考勤時間表.早上上班) and dateADD(mi,-V_考勤時間表.有效時長,V_考勤時間表.早上上班) )
from V_考勤時間表Top
17 楼teaism()回复于 2003-12-05 17:06:26 得分 0
你错得很明显,DATEDIFF出来是数值型,cdate日期型怎么会用来BETWEEN呢?
显然要用DATEADD()
Top
18 楼BenyMo(BenyMo)回复于 2003-12-08 10:49:26 得分 0
是的.就是一值沒人提出.Top




