VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1677|回复: 13

SQL表中获取时间段里每一天的数据,如果表里没有这一天的记录数据就为零

[复制链接]

2

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-1-22 17:20:01 | 显示全部楼层 |阅读模式
表 A
id  value  date  
1   aa    2017-01-02
2   bb    2017-01-01
3   cc    2017-01-04

现要得到在2017-01-02 到 2017-01-05的如下记录

value  date  
aa     2017-01-02
0      2017-01-03
cc     2017-01-04
o      2017-01-05

SQL查询语句能够完成吗,高手指点下,感激不尽~
回复

使用道具 举报

0

主题

93

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-2-2 07:54:01 | 显示全部楼层
select * from 表 where convert(varchar(8),date,112) between '20170102'and ''20170105'
回复

使用道具 举报

0

主题

93

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-2-2 08:27:01 | 显示全部楼层
select * from 表 where convert(varchar(10),date,120) between '2017-01-02'and ''2017-01-05'
或加小时段
select * from 表 where date between '2017-01-02 00:00:00'and ''2017-01-05 23:59:59'
回复

使用道具 举报

0

主题

66

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-2-2 10:36:01 | 显示全部楼层
他是要没有的日期也要列出,恶魔右指 没看清。。
回复

使用道具 举报

2

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-2-2 13:27:02 | 显示全部楼层
对,没有的日期也要列出
回复

使用道具 举报

0

主题

211

帖子

108.00

积分

新手上路

Rank: 1

积分
108.00
发表于 2020-2-2 14:18:01 | 显示全部楼层

create table T(id  int, value varchar(10),  [date] datetime)
insert T select 1,   'aa',    '2017-01-02'
union all select 2,   'bb',    '2017-01-01'
union all select 3,   'cc',    '2017-01-04'

select isnull(B.value, '0') as value, A.*  from
(
select [Date]='2017-01-02'
union all select '2017-01-03'
union all select '2017-01-04'
union all select '2017-01-05'
) as A
left join T as B on A.[Date]=B.[Date]

--result
value      Date      
---------- ----------
aa         2017-01-02
0          2017-01-03
cc         2017-01-04
0          2017-01-05

(4 row(s) affected)
回复

使用道具 举报

0

主题

93

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-2-3 18:00:01 | 显示全部楼层
create table ta(id int,  value varchar(5),  date datetime)
insert ta  
select 1,   'aa' ,   '2017-01-02'
union all select 2,   'bb' ,   '2017-01-01'
union all select 3,   'cc' ,   '2017-01-04'

生成一个时间段列:
declare @ta table(t_date datetime)
declare @i datetime
set @i='2017-01-01 00:00:00'
while @i!>'2017-1-31 00:00:00'
begin
insert @ta select convert(varchar(10),@i,120)
select @i=@i+1
end

select 时间=convert(varchar(10),t_date,120),value=isnull(value,0) from @ta a , ta
where convert(varchar(10),t_date,120)*=convert(varchar(10),date,120)
and convert(varchar(10),t_date,120) between '2017-01-02'and '2017-01-05'

时间         value
---------- -----
2017-01-02 aa
2017-01-03 0
2017-01-04 cc
2017-01-05 0

(所影响的行数为 4 行)
回复

使用道具 举报

0

主题

93

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-2-3 20:30:01 | 显示全部楼层
@ta 为表变量生成一个月的日期表,与下面的语句一起用,就不用生成临时表
回复

使用道具 举报

2

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-2-4 10:30:02 | 显示全部楼层
仍然谢谢!我要的是任意时间段的。
回复

使用道具 举报

2

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-2-4 11:30:01 | 显示全部楼层
哦,谢谢!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表