--1.删除测试用表
IF OBJECT_ID(N'Test', N'U') IS NOT NULL
DROP TABLE Test--2.建立测试表,并填充测试数据
SELECT * INTO Test 
FROM
(
SELECT CONVERT(DATETIME, '2008-1-1', 120) AS dt UNION ALL SELECT '2008-1-15' UNION ALL SELECT '2008-1-31'
UNION ALL SELECT '2008-2-1' UNION ALL SELECT '2008-2-15' UNION ALL SELECT '2008-2-29'
UNION ALL SELECT '2007-2-1' UNION ALL SELECT '2007-2-15' UNION ALL SELECT '2007-2-28'
UNION ALL SELECT '2007-4-1' UNION ALL SELECT '2007-4-15' UNION ALL SELECT '2007-4-30'
) T--3.根据日期计算当月有多少天
SELECT *
--当月天数=32-[(上月最后最后一天+32天)的日期值]
--e.g. '2008-1':32-day('2008-2-1') '2008-2':32-day('2008-3-3')
, ds1=32-DAY(dt-DAY(dt)+32)

--当月天数=当月最后一天的日期值
--e.g. '2008-1':day('2008-1-31') '2008-2':day('2008-2-29')
, ds2=DAY(DATEADD(mm,1,dt)-DAY(DATEADD(mm,1,dt)))
, ds3=DAY(DATEADD(mm, MONTH(dt), dt-DATEPART(dy,dt)))
, ds4=DAY(DATEADD(d, -1, CONVERT(VARCHAR(8), DATEADD(m,1,dt), 120)+'01')) --当月天数=本月一号到下月一号的天数差值
--e.g. datediff(d, '2008-1-1', '2008-2-1')
, ds5=DATEDIFF(d, DATEADD(dd,1-DAY(dt),dt), DATEADD(mm, 1, DATEADD(dd,1-DAY(dt),dt)))
, ds6=DATEDIFF(d, DATEADD(m, DATEDIFF(m, 0, dt), 0), DATEADD(m, datediff(m, 0, dt)+1, 0))
, ds7=DATEDIFF(d, CONVERT(VARCHAR(8), dt, 120)+'01', CONVERT(VARCHAR(8), DATEADD(m,1,dt), 120)+'01')
from Test/*
dt                      ds1         ds2         ds3         ds4         ds5         ds6         ds7
----------------------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
2008-01-01 00:00:00.000 31          31          31          31          31          31          31
2008-01-15 00:00:00.000 31          31          31          31          31          31          31
2008-01-31 00:00:00.000 31          31          31          31          31          31          31
2008-02-01 00:00:00.000 29          29          29          29          29          29          29
2008-02-15 00:00:00.000 29          29          29          29          29          29          29
2008-02-29 00:00:00.000 29          29          29          29          29          29          29
2007-02-01 00:00:00.000 28          28          28          28          28          28          28
2007-02-15 00:00:00.000 28          28          28          28          28          28          28
2007-02-28 00:00:00.000 28          28          28          28          28          28          28
2007-04-01 00:00:00.000 30          30          30          30          30          30          30
2007-04-15 00:00:00.000 30          30          30          30          30          30          30
2007-04-30 00:00:00.000 30          30          30          30          30          30          30(12 row(s) affected)
*/--4.删除测试表
DROP TABLE Test

解决方案 »

  1.   


    第一种方法就是你和kelph提出的,+100分,,,
      

  2.   


    那倒不用,是kelph先回答的,我怎么说也有抄袭的嫌疑,呵呵,给kelph加100吧
      

  3.   

    enum
    SELECT dt,DAY(MAX(dtx)) FROM
    (
    SELECT dt,CONVERT(VARCHAR(7),dt,120) + '-' + RTRIM(span) dtx FROM test a
    CROSS JOIN
    (SELECT 28 span UNION ALL SELECT 29 UNION ALL SELECT 30 UNION ALL SELECT 31) b
    ) x
    WHERE ISDATE(dtx)=1
    GROUP BY dt
      

  4.   

    IT技术挺全的,不错,鼓励一下:http://www.ciitc.com
      

  5.   

    It seems to be not very difficult
      

  6.   

    哇卡卡,case when ,就2月份需要判斷,其他寫死
    我提出的新方法,100分哇~~~~
      

  7.   

    select *,cson=datediff(day,dt,dateadd(mm,1,dt)) from test
      

  8.   

    select day(dateadd(ms,-100,DATEADD(mm, DATEDIFF(m,0,'2008-05-05')+1,0)))
      

  9.   


    这个跟我以前写的一样,有bug.前一月天数大于下一月时,dateadd(mm,1 加不上去。
    2008-1-31 得到的是 2009-2-29
      

  10.   

    select dsN=day(dateadd(ms,-100,DATEADD(mm, DATEDIFF(m,0,dt)+1,0)))
    ,ds1=32-DAY(dt-DAY(dt)+32)FROM
    (
        SELECT CONVERT(DATETIME, '2008-1-1', 120) AS dt UNION ALL SELECT '2008-1-15' UNION ALL SELECT '2008-1-31'
        UNION ALL SELECT '2008-2-1' UNION ALL SELECT '2008-2-15' UNION ALL SELECT '2008-2-29'
        UNION ALL SELECT '2007-2-1' UNION ALL SELECT '2007-2-15' UNION ALL SELECT '2007-2-28'
        UNION ALL SELECT '2007-4-1' UNION ALL SELECT '2007-4-15' UNION ALL SELECT '2007-4-30'
    ) T
    /*
    dsN         ds1         
    ----------- ----------- 
    31          31
    31          31
    31          31
    29          29
    29          29
    29          29
    28          28
    28          28
    28          28
    30          30
    30          30
    30          30(所影响的行数为 12 行)
    */
      

  11.   


    --常用的方法你都列出來,看來要100分還得要弄個稀奇八怪的東東出來了
    declare @t varchar(07)
    set @t='2007-02'
    select right(max(@t+t_day),2)
    from (select '-28' as t_day union select '-29' union select '-30' union select '-31') T
    where isdate(@t+t_day)=1
    /*
    28
    */set @t='2008-02'
    select right(max(@t+t_day),2)
    from (select '-28' as t_day union select '-29' union select '-30' union select '-31') T
    where isdate(@t+t_day)=1
    /*
    29
    */set @t='2008-04'
    select right(max(@t+t_day),2)
    from (select '-28' as t_day union select '-29' union select '-30' union select '-31') T
    where isdate(@t+t_day)=1
    /*
    30a
    */set @t='2008-05'
    select right(max(@t+t_day),2)
    from (select '-28' as t_day union select '-29' union select '-30' union select '-31') T
    where isdate(@t+t_day)=1
    /*
    31
    */
      

  12.   


    --当月天数=32-[(上月最后最后一天+32天)的日期值]
    --e.g. '2008-1':32-day('2008-2-1') '2008-2':32-day('2008-3-3') 
    ds1=32-DAY(dt-DAY(dt)+32)期待詳細註解!
    另外2种原理都好理解,能否分析下這種方法的原理?
      

  13.   

    [Quote=引用楼主 dobear_0922 的帖子:]
    SQL 
    code--1.删除测试用表IFOBJECT_ID(N'Test', N'U')ISNOTNULLDROPTABLETest--2.建立测试表,并填充测试数据SELECT*INTOTestFROM(SELECTCONVERT(DATETIME,'2008-1-1',120)ASdtUNIONALLSELECT'2008-1-15'UNIONALLSELECT'2008-1-31'UNIONALLSELECT'2008-2-1'UNIONALLSELECT'2008-2-15'UNIONALLSELECT'2008-2-29'UNIONALLSELECT'2007-2-1'UNIONALLSELECT'2007-2-15'UNIONALLSELECT'2007-2-28'UNIONALLSELECT'2007-4-1'UNIONALLSELE…
    [/Q
    uote]
      

  14.   

    乳溝的也看懂了,用年份月份+28、29、30、31,取最大的且為合法日期的天數部分。
    槍手大哥的是取月份最後一天的是該月的第幾天。
    ds1=32-DAY(dt-DAY(dt)+32)這個是什麽原理?誰來解釋一下?
    虛心學習!
      

  15.   

    [Quote= 48  rockyvan :]
    +28293031 
     
    ds1=32-DAY(dt-DAY(dt)+32) 

    [/Quote]
    dt-DAY(dt) 
      

  16.   

    print 61-DAY(dt-DAY(dt)+61)
      

  17.   

    有个简单的```
    DECLARE @TimecardYear int,@TimecardMonth tinyint
    SELECT @TimecardYear=2007,@TimecardMonth=11select DAY(DATEADD(DAY,-1,DATEADD(MONTH,1,CAST(@TimecardYear*10000+@TimecardMonth*100+1 AS VARCHAR(8)))))
      

  18.   


    IT技术挺全的,不错,鼓励一下:http://www.ciitc.com
      

  19.   

    好消息,
    dobear_0922 员外散分了大家快来接分!
      

  20.   

    好技术库,不容错过:http://www.ciitc.com
      

  21.   

    select datediff(day,getdate(),dateadd(month,1,getdate()))
      

  22.   

    select DATEPART(m , getdate()) as 月份,datediff(dd , getdate(), dateadd(mm, 1,getdate())) as 天数 显示某一个月的天数这样就可以了啊
      

  23.   

    嗯,学习。
    --当月的周后一天的值
    Select Day(DateAdd(mm,1,dt)-Day(DateAdd(mm,1,dt)))
    --当月最后一天的日期
    Select DateAdd(mm,1,dt)-Day(DateAdd(mm,1,dt))
    --每个月第一天的日期
    Select getDate()-Day(getDate()-1)
      

  24.   

    嗯,学习。
    --当月的周后一天的值
    Select Day(DateAdd(mm,1,dt)-Day(DateAdd(mm,1,dt)))
    --当月最后一天的日期
    Select DateAdd(mm,1,dt)-Day(DateAdd(mm,1,dt))
    --每个月第一天的日期
    Select getDate()-Day(getDate()-1)