考虑需要创建日期的结果集.我们有开始和结束日期,我们想要生成两者之间的日期列表.
DECLARE @Start datetime
,@End datetime
DECLARE @AllDates table
(@Date datetime)
SELECT @Start = 'Mar 1 2009', @End = 'Aug 1 2009'
--need to fill @AllDates. Trying to avoid looping.
-- Surely if a better solution exists.
Run Code Online (Sandbox Code Playgroud)
考虑使用WHILE循环的当前实现:
DECLARE @dCounter datetime
SELECT @dCounter = @Start
WHILE @dCounter <= @End
BEGIN
INSERT INTO @AllDates VALUES (@dCounter)
SELECT @dCounter=@dCounter+1
END
Run Code Online (Sandbox Code Playgroud)
问题:如何使用T-SQL创建一组在用户定义范围内的日期?假设SQL 2005+.如果您的答案是使用SQL 2008功能,请标记为.
我正在尝试生成一个包含一系列日期时间的表.
我有指定的开始日期时间和结束日期时间(结束日期时间是序列结束),我添加一个时间间隔〜(这可能会有所不同)到开始日期时间(以秒为单位),这给了我结束日期时间.
下一个序列使用结束日期时间作为其起始值,并以秒为单位添加时间间隔.为了证明我需要的输出.有没有一种快速的方法来创建这样的表,除了使用大量插入命令?,我真的很难过
StartTime Endtime Duration
2011-07-20 11:00:33 2011-07-20 11:09:47 554
2011-07-20 11:09:47 2011-07-20 11:19:01 554
declare @StartTime datetime = '2011-07-20 11:00:33',
@EndTime datetime = '2011-07-20 15:37:34'
@Interval int = 554 -- this can be changed.
insert into tmp_IRange
values('2011-07-20 11:00:33', DATEADD(SECONDS, @Duration, 2011-07-20 11:00:33))
Run Code Online (Sandbox Code Playgroud)
这变得非常繁琐..尤其是当结束日期时间2011-07-20 15:37:34
有很多插入语句时:(
我需要创建一个包含日期范围的临时表,以及一些包含占位符值(0)以供将来使用的列.我需要的日期是$ startDate和$ endDate之间每个月的第一天,这些变量可能相隔数年.
我原来的sql语句看起来像这样:
select dbo.FirstOfMonth(InsertDate) as Month, 0 as Trials, 0 as Sales
into #dates
from customer
group by dbo.FirstOfMonth(InsertDate)
Run Code Online (Sandbox Code Playgroud)
"FirstOfMonth"是一个用户定义的函数,它完全按照它所说的做,返回当月的第一天所提供的日期,时间恰好是午夜.
这几乎完全是我所需要的,直到我发现我的日期偶尔会出现间隙,我有几个月没有记录插入日期.由于我的结果仍然缺少几个月,我需要一个不同的方法.
我已经向存储过程添加了以下声明,预计它们需要我需要的日期范围...
declare $startDate set $startDate = select min(InsertDate) from customer
declare $endDate set $endDate = select max(InsertDate) from customer
Run Code Online (Sandbox Code Playgroud)
......但我不知道该怎么做.
我知道这个问题与这个问题类似,但是坦率地说,这个答案已经过去了(我不经常使用SQL,当我这样做时,它往往是在旧版本的SQL Server上)并且有一些小问题差点让我失望.
所以我想要的是生成特定时间范围内的所有小时.
所以考虑到上午11点到下午2点,我会得到:
11:00 AM
12:00 PM
1:00 PM
2:00 PM
Run Code Online (Sandbox Code Playgroud)
我试图避免必须存储商店可能打开的每个特定小时,只是存储范围(我需要比较其他时间的小时)
谢谢
我正在尝试获取 30 天的用户报告,它将返回日期和用户总数作为该日期创建的计数,我使用此查询完成了此操作
Select count(*) As [Count] ,
(SELECT CONVERT(date, AddDate)) As [Date]
from Users
WHERE AddDate >= (SELECT DateAdd(month, -1, Convert(date, GetDate())))
Group By CONVERT(date, AddDate)
Run Code Online (Sandbox Code Playgroud)
它只给我创建任何用户的日期,但我想显示所有30 天,如果它的计数为 0。
我想对月度报告做同样的事情。我正在获取创建用户的月份,现在我想将其更改为获取本月以来的最后 12 个月及其总用户数。为此,我正在使用这个查询
Select count(*) As [Count] ,
(Select DATEPART( month , DateAdd( month , DATEPART(mm,AddDate) , -1 ) )) as Month
from Users
WHERE AddDate >= (SELECT DateAdd(YEAR, -1, Convert(date, GetDate())))
Group By DATEPART(mm,AddDate)
Run Code Online (Sandbox Code Playgroud) 我在 postgres 中有一张这样的表:
| ID | 开放日期 | 关闭日期 |
|---|---|---|
| 5 | 2006-08-04 | 2019-12-31 |
他们之间相隔4897天。我需要将日期范围改为 date 以便每天有一条记录。例如:
| ID | 开放日期 | 关闭日期 | 有效日期 |
|---|---|---|---|
| 5 | 2006-08-04 | 2019-12-31 | 2006-08-04 |
| 5 | 2006-08-04 | 2019-12-31 | 2006-08-05 |
| 5 | 2006-08-04 | 2019-12-31 | 2006-08-06 |
| ... | ………… | ………… | ………… |
| 5 | 2006-08-04 | 2019-12-31 | 2019-12-31 |
我尝试了这里提供的查询,如下所示:
SELECT
id,
open_date,
close_date,
open_date + seq.seqnum * interval '1 day' AS valid_date,
FROM
TAB1
LEFT JOIN (
SELECT
row_number() over () AS seqnum
FROM
TAB1) seq ON seqnum <= (close_date - open_date)
)
Run Code Online (Sandbox Code Playgroud)
TAB1 包含 600 行。运行此查询后,它会生成正确的记录,但每个 id 最多只能生成 600 条记录。这意味着此日期范围仅限到 …