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,否则会报错。

  • 相关阅读:
    ecshop学习入门
    php跳转页面代码
    PHP验证登录用户名和密码
    使用self关键字调用类体中的静态成员
    PHP中读取文件的几个方法
    MVC5 Entity Framework学习之更新相关数据
    global.asax文件的应用
    DbSet<TEntity> 类
    IDisposable接口详解
    bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
  • 原文地址:https://www.cnblogs.com/DBFocus/p/1785748.html
Copyright © 2011-2022 走看看