2012-01-12 134 views
3

我想查询以文本形式显示当前月份,然后在下列行中打印当年余下年份,直到本年度的所有月份打印。行当前月份和当年剩余月份

这有点难以解释,所以我做了下面的例子。我知道下面的代码是荒谬的,但这是我知道用我目前的技能水平来做这件事的唯一方法。理想情况下,我还想从打印一个整数转换为打印月份的字符值(因此1将是1月)。我知道我可以通过一个案件来做到这一点,但是我确信还有一种更好的方式我还没有接触到。

declare @currentmonth as int = datepart(month, getdate()) 
select 
    @currentmonth 
union 
select 
    @currentmonth +1 
union 
select 
    @currentmonth +2 
union 
select 
    @currentmonth +3 
union 
select 
    @currentmonth +4 
union 
select 
    @currentmonth +5 
union 
select 
    @currentmonth +6 
union 
select 
    @currentmonth +7 
union 
select 
    @currentmonth +8 
union 
select 
    @currentmonth +9 
union 
select 
    @currentmonth +10 
union 
select 
    @currentmonth +11 

回答

4

在SQL Server 2008+你可以使用这个

SELECT v.i 
FROM (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) v(i) 
WHERE v.i>=MONTH(GETDATE()) 
+0

简单eleg蚂蚁,谢谢你 – Codingo 2012-01-12 08:15:31

+0

@迈克尔很高兴这有帮助。 – 2012-01-12 08:21:10

+0

此功能称为行构造函数。这是一个很棒的功能。然而,与常规方式相反,使用此功能完成的大量插入操作会受到性能影响。 [相关文章](http://connect.microsoft.com/SQLServer/feedback/details/508112/insert-performance-of-row-constructor-is-quiet-bad) – Animesh 2012-01-12 11:49:36

3

使用公用表表达式(SQL服务器2005+)一个偶然的机会:

declare @adate datetime 
set @adate = '2011-07-31' 

;with clndr(m) as (
    select @adate 
    union all 
    select dateadd(month, 1, m) 
    from clndr 
    where datepart(year, dateadd(month, 1, m)) = datepart(year, @adate) 
) 
select datename(month, m) 
from clndr 
1

与普通表表达式可以轻松编写代码

DECLARE @currentmonth INT 
    SET @currentmonth=datepart(month, getdate()) 
    ;WITH CTE AS 
    (SELECT @currentmonth AS currentmonth 
     UNION ALL 
    SELECT currentmonth +1 FROM CTE WHERE currentmonth <10 
    ) 

    SELECT * FROM CTE 
+0

复制另一个答案...真的吗? – Codingo 2012-01-12 09:36:15

+0

@Michael你应该看到sql语句,然后做出这样的评论。在SQL中唯一常见的是使用CTE,但逻辑完全不同 – praveen 2012-01-12 10:18:53

相关问题