我测试了下:
select case when isdate('2005'+'02'+'29')=1 then DATENAME(weekday,cast('2005'+'02'+'29' as datetime))
else '0' end--报错:从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。
这可能是因为在语句执行前,编译时,会先把“'2005'+'02'+'29' ”转换成日期,因为没这个日期,所以会先报错了。select case when isdate('2005'+'02'+'28')=1 then DATENAME(weekday,cast('2005'+'02'+'28' as datetime))
else '0' end
--成功:星期一
select case when isdate('2005'+'02'+'29')=1 then DATENAME(weekday,cast('2005'+'02'+'29' as datetime))
else '0' end--报错:从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。
这可能是因为在语句执行前,编译时,会先把“'2005'+'02'+'29' ”转换成日期,因为没这个日期,所以会先报错了。select case when isdate('2005'+'02'+'28')=1 then DATENAME(weekday,cast('2005'+'02'+'28' as datetime))
else '0' end
--成功:星期一
解决方案 »
- Sql server2000 有64位的吗?
- 如何将SqlServer数据库中表空间最大的10个列出来。
- 看看我這個游标怎么改?关于想得出一年的日期
- 连接查询
- 如何用sql存储过程调用oracle的存储过程?
- 创建分发服务器时,提示“distributor_admin”登陆失败 错误:18456?
- 在image字段里面存入一些20M左右的图片,这样操作的时是很长,有没有办法显示进度呢?
- 菜鸟急问一个常见的问题,关于自增长型字段的设定!!急!!在线等待!
- 请各位老大和zjcxc(邹建)进来看看啊!复杂查询问题?
- sql server 中sql语句的字符串中含有"'"怎么办?
- 如何取得8月1号到11月30号之间的时间?
- 请问如何实现。
delcare @year char(4),@month char(2),@month2 char(2)的
也就是说得遍历整个月,必须要作判断,否则直接写就更加错了
正确的情况就不用说了,就是这种不存在的情况才做的判断,但是判断似乎没有作用,各位仁兄有何高见?
语句本身没问题,但在编译的时候会因为日期不存在而产生异常,你最好控制一下别传个不存在的日期给他,因为当转换的时候是肯定会出错的
select day(dateadd(dd,-1,'2005-03-01'))
取上与的最大天数就是下月的一号减一天。
set @year='2004'
set @year2='2004'
set @month='09'
set @month2='10'
SET DATEFIRST 1
select @year,@year2,@month,@month2
,datepart(weekday,convert(datetime,@year+@month+'21'))
,datepart(weekday,convert(datetime,@year+@month+'22'))
,datepart(weekday,convert(datetime,@year+@month+'23'))
,datepart(weekday,convert(datetime,@year+@month+'24'))
,datepart(weekday,convert(datetime,@year+@month+'25'))
,datepart(weekday,convert(datetime,@year+@month+'26'))
,datepart(weekday,convert(datetime,@year+@month+'27'))
,datepart(weekday,convert(datetime,@year+@month+'28'))
,case isdate(@year+@month+'29') when 1
then
case when (datepart(weekday,convert(datetime,@year+@month+'28'))+1)>7
then convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))-6)
else convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))+1)
end
else ''
end
,case isdate(@year+@month+'30') when 1
then
case when (datepart(weekday,convert(datetime,@year+@month+'28'))+2)>7
then convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))-5)
else convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))+2)
end
else ''
end
,case isdate(@year+@month+'31') when 1
then
case when (datepart(weekday,convert(datetime,@year+@month+'28'))+3)>7
then convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))-4)
else convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))+3)
end
else ''
end
,datepart(weekday,convert(datetime,@year2+@month2+'01'))
,datepart(weekday,convert(datetime,@year2+@month2+'02'))
,datepart(weekday,convert(datetime,@year2+@month2+'03'))
,datepart(weekday,convert(datetime,@year2+@month2+'04'))
,datepart(weekday,convert(datetime,@year2+@month2+'05'))
,datepart(weekday,convert(datetime,@year2+@month2+'06'))
,datepart(weekday,convert(datetime,@year2+@month2+'07'))
,datepart(weekday,convert(datetime,@year2+@month2+'08'))
,datepart(weekday,convert(datetime,@year2+@month2+'09'))
,datepart(weekday,convert(datetime,@year2+@month2+'10'))
,datepart(weekday,convert(datetime,@year2+@month2+'11'))
,datepart(weekday,convert(datetime,@year2+@month2+'12'))
,datepart(weekday,convert(datetime,@year2+@month2+'13'))
,datepart(weekday,convert(datetime,@year2+@month2+'14'))
,datepart(weekday,convert(datetime,@year2+@month2+'15'))
,datepart(weekday,convert(datetime,@year2+@month2+'16'))
,datepart(weekday,convert(datetime,@year2+@month2+'17'))
,datepart(weekday,convert(datetime,@year2+@month2+'18'))
,datepart(weekday,convert(datetime,@year2+@month2+'19'))
,datepart(weekday,convert(datetime,@year2+@month2+'20'))