希望一切顺利。我有一张简单的表格,下面有5条记录。
Id: Date
123 9/1/15
123
123
123
123 9/5/15
如何在SQL Server中写入以显示从2015年2月9日到9月4日的缺失日期。 我正在考虑使用循环,但我的工资等级还没有。基本上,我想知道如何编写一个显示缺少日期的sql脚本。
有人可以帮忙吗? 乔
答案 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
,因为我们会排除某些行,因为我们只有SELECT
和ID
才能分组;因此3条记录ADMIT
将被截断为1条记录。
答案 2 :(得分:0)
尝试使用MINUS - 下面演示数字,您可以将它用于日期。 MINUS应该使查询可维护,它只是查询。
查询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 |
希望它会对你有所帮助:)。