在sql中显示日期之间的日期

时间:2015-09-15 18:14:45

标签: sql

希望一切顺利。我有一张简单的表格,下面有5条记录。

Id:    Date
123    9/1/15
123
123
123
123    9/5/15

如何在SQL Server中写入以显示从2015年2月9日到9月4日的缺失日期。 我正在考虑使用循环,但我的工资等级还没有。基本上,我想知道如何编写一个显示缺少日期的sql脚本。

有人可以帮忙吗? 乔

3 个答案:

答案 0 :(得分:1)

我猜你想要这样的东西:

WITH T(ID, Date, MaxDate) AS (
    SELECT ID, MIN(Date), MAX(Date) FROM MyTable GROUP BY ID
    UNION ALL
    SELECT ID, DATEADD(day, 1, Date), MaxDate FROM T WHERE Date < MaxDate 
)
SELECT ID, Date FROM T ORDER BY ID, Date

请按照这个小提琴查看它的实际效果:http://sqlfiddle.com/#!6/682180/2/0

信用:我的查询很大程度上基于这个答案(由鲁本斯提出):Getting Dates between a range of dates

我必须说我不喜欢数据库层负责数据表示的想法。 请考虑在桌子上进行修理,填写缺失的日期。 虽然我不知道怎么样;似乎没有唯一的标识符来区分三个NULL记录。 您可能希望将其恢复为数据源;看起来你一直在导入Excel工作表。 尝试在那里修复它。

答案 1 :(得分:0)

这样的事情怎么样?

if ( $cmd[0] eq "update" ) {
    print "Old subnet ex: 10.0.0\n";
    my $oldsubnet = <STDIN>;
    chomp $oldsubnet;
    print "New subnet ex: 10.0.0\n";
    my $newsubnet = <STDIN>;
    chomp $newsubnet;

    my $file = "path\\file.csv";

    open( my $fh, '<', $file ) or die "'$file' would not open $!";

    while ( my $line = <$fh> ) {
        chomp $line;
        my @fields = split ",", $line;
        my $string = $fields[1];

        $string =~ s/$oldsubnet/$newsubnet/g;

        my $ofile = "path\\test.csv";

        open( my $ofh, '>>', $ofile ) or die "'$ofile' would not open $!";
        print $ofh "$string\n";
    }
}

基本上,这只是创建一个包含虚拟数据的临时表,因此我们可以测试一些值。然后执行对每个行号使用行排名的查询,并将该值添加到原始列表中找到的最小日期...

我们需要DECLARE @TMP TABLE ( ID INT, ADMIT DATE ) INSERT INTO @TMP ( ID, ADMIT ) VALUES ( 123, '2015-09-01' ) ,( 123, NULL ) ,( 123, NULL ) ,( 123, NULL ) ,( 123, '2015-09-05' ) SELECT TMP.ID ,CASE WHEN TMP.ADMIT IS NULL THEN DATEADD(D,(ROW_NUMBER() OVER (PARTITION BY TMP.ID, TMP.ADMIT ORDER BY TMP.ID ASC)),B.MIN_ADMIT) ELSE TMP.ADMIT END AS NEW_DATE FROM @TMP AS TMP INNER JOIN ( SELECT ID, MIN(ADMIT) AS MIN_ADMIT FROM @TMP GROUP BY ID ) B ON B.ID = TMP.ID ORDER BY TMP.ID, NEW_DATE ASC 因为我们需要执行INNER JOIN子句才能从原始表中获取GROUP BY日期。我们无法在原始MIN中执行GROUP BY,因为我们会排除某些行,因为我们只有SELECTID才能分组;因此3条记录ADMIT将被截断为1条记录。

答案 2 :(得分:0)

尝试使用MINUS - 下面演示数字,您可以将它用于日期。 MINUS应该使查询可维护,它只是查询。

SQL Fiddle

查询1

select n from
 ( select rownum n from dual connect by level <= 5)
 where n >= 1
 MINUS
 select n from
 ( select rownum n from dual connect by level <= 2)
 where n >= 1

<强> Results :     | N |     | --- |     | 3 |     | 4 |     | 5 |

希望它会对你有所帮助:)。