关键词:
【中文标题】基于日期获取所有日期 - sql【英文标题】:Based on day fetch all dates - sql 【发布时间】:2018-04-11 11:13:09 【问题描述】:我有开始日期、结束日期和日期名称。如何在sql中获取特定日期的这两个日期之间的所有日期?
示例数据:
开始日期:2018 年 4 月 11 日 结束日期:2018 年 5 月 11 日 日期:星期一、星期四预期输出:周一和周四开始和结束日期之间的所有日期并将它们存储在表中
更新 我现在的代码(不工作)
; WITH CTE(dt)
AS
(
SELECT @P_FROM_DATE
UNION ALL
SELECT DATEADD(dw, 1, dt) FROM CTE
WHERE dt < @P_TO_DATE
)
INSERT INTO Table_name
(
ID
,DATE_TIME
,STATUS
,CREATED_DATE
,CREATED_BY
)
SELECT @P_ID
,(SELECT dt FROM CTE WHERE DATENAME(dw, dt) In ('tuesday','friday',null))
,'NOT SENT'
,CAST(GETDATE() AS DATE)
,@USER_ID
【问题讨论】:
你需要一个日历表,或者一个 cte 生产日历表。 您使用的是哪个DBMS? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签postgresql
、oracle
、sql-server
、db2
、...
请edit您的问题并添加一些sample data 和基于该数据的预期输出。 Formatted text 请no screen shots。 (edit 您的问题 - 在 cmets 中不要邮政编码或其他信息)
我已经编辑了我的问题
也许这是一个很好的起点:sqlservercentral.com/articles/calendar/145206
【参考方案1】:
在范围之间生成日期的另一种方法可能类似于以下查询。与CTE
或WHILE
循环相比,这将更快。
DECLARE @StartDate DATETIME = '2018-04-11'
DECLARE @EndDate DATETIME = '2018-05-15'
SELECT @StartDate + RN AS DATE FROM
(
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)))-1 RN
FROM master..[spt_values] T1
) T
WHERE RN <= DATEDIFF(DAY,@StartDate,@EndDate)
AND DATENAME(dw,@StartDate + RN) IN('Monday','Thursday')
注意:
如果master..[spt_values]
中存在的行数不足以满足提供的范围,您可以进行交叉连接以获得更大的范围,如下所示。
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)))-1 RN
FROM master..[spt_values] T1
CROSS JOIN master..[spt_values] T2
通过这种方式,您将能够在间隔为 6436369 天的范围内生成日期。
【讨论】:
对此的几点说明:1. spt_values is undocumented。 2.您可以摆脱最外层的查询,并在中间查询上执行它的 where 子句。 3.除此之外,它与我即将发布的内容非常接近,所以+1。 @ZoharPeled,感谢您的输入,您是正确的。我已经删除了外部选择。【参考方案2】:您可以使用recursive common table expression (CTE) 生成日期列表。使用datepart(dw, ...)
,您可以过滤一周中的特定日期。
创建 3 月 1 日至今天之间的星期一和星期四列表的示例:
create table ListOfDates (dt date);
with cte as
(
select cast('2018-03-01' as date) as dt -- First day of interval
union all
select dateadd(day, 1, dt)
from cte
where dt < getdate() -- Last day of interval
)
insert into ListOfDates
(dt)
select dt
from cte
where datepart(dw, dt) in (2, 5) -- 2=Monday and 5=Thursday
option (maxrecursion 0)
See it working at SQL Fiddle.
【讨论】:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
这是我遇到的错误。
不知道怎么解释,上面的查询可以在 SQL Fiddle 上运行!
create table ListOfDates (dt date, name varchar(20)); with cte as ( select cast('2018-03-01' as date) as dt union all select dateadd(day, 1, dt) from cte where dt < getdate() ) insert into ListOfDates (dt, name) select (select dt from cte where datepart(dw, dt) in (2, 5) ),-- Monday and Thursday 'hello'
在小提琴中尝试同样的方法
查询的select
部分不能产生多行。这必须在from
部分完成。有关插入名称和日期的方法,请参见此处:sqlfiddle.com/#!18/66678/1/0【参考方案3】:
这对你有用:
DECLARE @table TABLE(
ID INT IDENTITY(1,1),
Date DATETIME,
Day VARCHAR(50)
)
DECLARE @Days TABLE(
ID INT IDENTITY(1,1),
Day VARCHAR(50)
)
INSERT INTO @Days VALUES ('Monday')
INSERT INTO @Days VALUES ('Thursday')
DECLARE @StartDate DATETIME='2018-01-01';
DECLARE @EndDate DATETIME=GETDATE();
DECLARE @Day VARCHAR(50)='Friday';
DECLARE @TempDate DATETIME=@StartDate;
WHILE CAST(@TempDate AS DATE)<=CAST(@EndDate AS DATE)
BEGIN
IF EXISTS (SELECT 1 FROM @Days WHERE DAY IN (DATENAME(dw,@TempDate)))
BEGIN
INSERT INTO @table
VALUES (
@TempDate, -- Date - datetime
DATENAME(dw,@TempDate) -- Day - varchar(50)
)
END
SET @TempDate=DATEADD(DAY,1,@TempDate)
END
SELECT * FROM @table
【讨论】:
【参考方案4】:INSERT INTO TargetTab(dateCOL)
SELECT dateCOL
FROM tab
WHERE dateCOL >= startdate AND dateCOL <= enddate
AND (DATENAME(dw,dateCOL) ='Thursday' OR DATENAME(dw,dateCOL) = 'Monday')
试试这个查询来得到你的结果。
【讨论】:
我不明白dateCol
是什么
将其替换为您的表格日期列的名称【参考方案5】:
使用递归 CTE 生成日期,然后按工作日过滤。
SET DATEFIRST 1 -- 1: Monday, 7 Sunday
DECLARE @StartDate DATE = '2018-04-11'
DECLARE @EndDate DATE = '2018-05-15'
DECLARE @WeekDays TABLE (WeekDayNumber INT)
INSERT INTO @WeekDays (
WeekDayNumber)
VALUES
(1), -- Monday
(4) -- Thursday
;WITH GeneratingDates AS
(
SELECT
GeneratedDate = @StartDate,
WeekDay = DATEPART(WEEKDAY, @StartDate)
UNION ALL
SELECT
GeneratedDate = DATEADD(DAY, 1, G.GeneratedDate),
WeekDay = DATEPART(WEEKDAY, DATEADD(DAY, 1, G.GeneratedDate))
FROM
GeneratingDates AS G -- Notice that we are referencing a CTE that we are also declaring
WHERE
G.GeneratedDate < @EndDate
)
SELECT
G.GeneratedDate
FROM
GeneratingDates AS G
INNER JOIN @WeekDays AS W ON G.WeekDay = W.WeekDayNumber
OPTION
(MAXRECURSION 30000)
【讨论】:
【参考方案6】:试试这个:
declare @start date = '04-11-2018'
declare @end date = '05-11-2018'
declare @P_ID int = 1
declare @USER_ID int = 11
;with cte as(
select @start [date]
union all
select dateadd(DAY, 1, [date]) from cte
where [date] < @end
)
--if MY_TABLE doesn't exist
select @P_ID,
[date],
'NOT SENT',
cast(getdate() as date),
@USER_ID
into MY_TABLE
from cte
--here you can specify days: 1 - Sunday, 2 - Monday, etc.
where DATEPART(dw,[date]) in (2, 5)
option (maxrecursion 0)
--if MY_TABLE does exist
--insert into MY_TABLE
--select @P_ID,
-- [date],
-- 'NOT SENT',
-- cast(getdate() as date),
-- @USER_ID
--from cte
--where DATEPART(dw,[date]) in (2, 5)
--option (maxrecursion 0)
【讨论】:
@prasanna 请尝试更新查询。此外,您可以删除评论,因为它们与讨论无关(我删除了我的)。SQL:获取一组日期对之间的所有日期
】SQL:获取一组日期对之间的所有日期【英文标题】:SQL:Gettingalldatesbetweenasetofdatepairs【发布时间】:2019-07-1612:39:40【问题描述】:我有一个包含一些数据和时间段的表格,即开始日期和结束日期------------------------------|id|start_dat... 查看详情
SQL — 获取 A 列日期与 B 列日期相差 7 天的所有行
】SQL—获取A列日期与B列日期相差7天的所有行【英文标题】:SQL—getallrowswherecolumnA\'sdateisamultipleof7daysapartfromcolumnB\'sdate【发布时间】:2020-11-0121:17:02【问题描述】:CREATETABLEtable_1(`userid`VARCHAR(2),`date_accessed`DATE,`rank`INT,`country`VARCHA 查看详情
SQL获取两个日期之间的所有星期六
】SQL获取两个日期之间的所有星期六【英文标题】:SQLGetallSaturdaysbetweentwoDates【发布时间】:2021-04-2519:56:25【问题描述】:我试图在不使用循环的情况下查找两个日期(包括)之间的所有星期六。例如,2021年4月1日到2021年5月1日... 查看详情
获取日期范围与列中最小日期之间的所有行
】获取日期范围与列中最小日期之间的所有行【英文标题】:Gettingallrowsbetweendaterangewithmindateincolumn【发布时间】:2013-05-1020:19:15【问题描述】:我正在尝试为MSAccess构建一个SQL语句,以按产品从我们的数据库中获取所有销售,这... 查看详情
获取日期序列中所有缺失的日期
】获取日期序列中所有缺失的日期【英文标题】:Getallthemissingdatesinasequenceofdates【发布时间】:2016-10-0321:49:34【问题描述】:我正在尝试按升序排列日期序列中的所有缺失日期。如何在不使用任何函数或udfs的情况下使用简单的sq... 查看详情
SQL 获取帖子的最新评论日期 - 论坛
】SQL获取帖子的最新评论日期-论坛【英文标题】:SQLtogetLatestcommentdateforapost-DiscussionForum【发布时间】:2016-01-0200:10:35【问题描述】:我正在开发一个讨论论坛网站。当您打开论坛时,网络服务会获取所有活动帖子。标题、评论... 查看详情
sql查询获取最早日期
】sql查询获取最早日期【英文标题】:sqlquerytogetearliestdate【发布时间】:2010-03-0618:16:24【问题描述】:如果我有一个包含id、name、score、date列的表我想运行一个sql查询来获取id=2在数据集中具有最早日期的记录。您可以在查询中... 查看详情
sql获取两个日期之间的每周开始日期
】sql获取两个日期之间的每周开始日期【英文标题】:sqlgeteveryweekstartdatebetweentwodates【发布时间】:2016-01-2918:23:49【问题描述】:我有一个包含这些数据的表员工reported的日期和那一周的startdate(星期一)。现在他们没有工作所... 查看详情
尝试使用 SQL 在 PHP 中获取两个日期之间的日期
】尝试使用SQL在PHP中获取两个日期之间的日期【英文标题】:Tryingtogetdatesbetween2datesinPHPusingSQL【发布时间】:2021-06-0107:08:32【问题描述】:我正在使用此查询来获取两个日期之间的所有日期:$getDates="SELECTdaily_rate_dateFROMdaily_ratesW... 查看详情
sql查询获取最近4个星期五的日期
...五的日期。取决于用户输入计数将存储在另一个表中,并基于该值我想获取日期。例如,如果计数是5,我想获取最后5个星期五的日期。---------------------------------------------Id|fridaydate- 查看详情
基于日期的 Oracle SQL 最近行
】基于日期的OracleSQL最近行【英文标题】:OracleSQLMostRecentRowbasedonDate【发布时间】:2018-11-2517:06:09【问题描述】:我知道这个问题已经在论坛上被问过很多次了,我已经尝试了多种方法来获取我需要的东西,但总是有一些错误消... 查看详情
SQL 之间不包括所有查询范围(日期)
】SQL之间不包括所有查询范围(日期)【英文标题】:SQLbetweennotincludeallrangeofquery(date)【发布时间】:2014-09-1615:25:52【问题描述】:我有以下结构的表:我正在尝试获取两个日期之间的分组值,问题是结果不包含日期为2014-09-05的... 查看详情
SQL 按日期排序并按用户获取结果
】SQL按日期排序并按用户获取结果【英文标题】:SQLOrderbydateandgetresultsperuser【发布时间】:2016-08-1708:34:39【问题描述】:我有一个包含以下字段的数据库表IDUserIDCommentDate11Test2016-08-0722Test22016-08-1731Test32016-08-1642Test42016-08-15首先我... 查看详情
从sql server获取两个日期之间的数据
】从sqlserver获取两个日期之间的数据【英文标题】:Getdatabetweentwodatefromsqlserver【发布时间】:2021-05-1903:50:36【问题描述】:我想使用mssql和nodejs中的sequelize查询从sqlserver获取两个日期之间的所有数据。开始和结束日期来自reactfron... 查看详情
SQL 按日期分组,但也获取不带记录的日期
】SQL按日期分组,但也获取不带记录的日期【英文标题】:SQLgroupbydate,butgetdatesw/orecordstoo【发布时间】:2010-09-2821:11:19【问题描述】:是否有一种简单的方法来创建一个包含一段时间内所有日期的GROUPBYDATE(timestamp),无论是否有... 查看详情
SQL Select:获取列中的上一个日期
】SQLSelect:获取列中的上一个日期【英文标题】:SQLSelect:GetthepreviousDateincolumn【发布时间】:2017-10-2611:45:59【问题描述】:我的SQL服务器中有一张表,上面有一些日期。现在我想创建一个Select,它给我一个包含所有日期的列,然... 查看详情
女士访问 SQL 查询以获取两个日期之间的生日
】女士访问SQL查询以获取两个日期之间的生日【英文标题】:MsacccessSQLQuerytogetBirthdaybetweentwodates【发布时间】:2022-01-0423:00:30【问题描述】:Ms访问SQLQuery以获取两个日期之间的生日我想知道谁的生日在给定日期之间。例如FromDate... 查看详情
Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目
】Pythonsqlite3SQL查询获取具有最新日期但每个唯一列限制的所有条目【英文标题】:Pythonsqlite3SQLqueryGetallentrieswithnewestdatebutlimitpersingleuniquecolumn【发布时间】:2020-08-2105:53:39【问题描述】:我有一个名为“fileEvents”的表。它有四... 查看详情