zoukankan      html  css  js  c++  java
  • SQL笔试题——生成日期列表

    最近做了一份SQL笔试题,总共包括十多道题,其中最后一道题是要写一个存储过程,输入为startDate和endDate,输出为一个日期列表。

    eg:如果startDate=‘2010-01-01’,endDate=’2010-02-01’,则输出为

    date
    2010-01-01
    2010-01-02
    2010-01-03
    2010-01-29
    2010-01-30
    2010-01-31
    2010-02-01

    这样的需求我在平时的工作中没有遇到过,通过思考有了一个思路,后面就照这个思路写了存储过程。

    现在手边有电脑,在SQL Server 2005中验证了一下当时的思路,发现总的方向是对的,但细节上有不少错。

    现在把主要代码贴在下面,留个纪念(偷懒不写存储过程了,在SQL Server 2005中测试通过):

    declare @startDate datetime;
    declare @endDate datetime;
    declare @numDays int;
    
    set @startDate = '2010-01-01';
    set @endDate = '2010-02-01';
    set @numDays = datediff(day, @startDate, @endDate) + 1;
    
    With NumDays as
    (
    	select top(@numDays)
    		row_number() over(order by (select 0)) as n
    	from
    		sys.objects o1,
    		sys.objects o2
    )
    select
    	convert(varchar(10), dateadd(day, NumDays.n - 1, @startDate), 120) as date
    from
    	NumDays;

    其中对两个sys.objects进行笛卡尔积连接,是为了生成足够多的行,可以换做sys.columns等大表。如果要生成的日期跨度非常大,可以考虑对3个表进行笛卡尔积。

    其中还需要注意的是必须为这些表取别名,我这里用了o1和o2,否则会报错。

  • 相关阅读:
    Codeforces467C George and Job
    Codeforces205E Little Elephant and Furik and RubikLittle Elephant and Furik and Rubik
    Codeforce205C Little Elephant and Interval
    51nod1829 函数
    51nod1574 排列转换
    nowcoder35B 小AA的数列
    Codeforce893E Counting Arrays
    gym101612 Consonant Fencity
    CodeForces559C Gerald and Giant Chess
    CodeForces456D A Lot of Games
  • 原文地址:https://www.cnblogs.com/DBFocus/p/1785748.html
Copyright © 2011-2022 走看看