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

  • 相关阅读:
    linux自动清理30天之前的文件
    Oracle树查询及相关函数
    jackson循环引用导致序列化stackOverFlow的解决
    java核心技术36讲笔记
    Quartz学习
    Quartz学习
    java核心技术36讲
    git常用命令
    CTCall简介(后续会继续补充)
    自定义导航栏,隐藏导航栏底部的灰色线条
  • 原文地址:https://www.cnblogs.com/DBFocus/p/1785748.html
Copyright © 2011-2022 走看看