基于日期获取所有日期 - sql

     2023-03-31     276

关键词:

【中文标题】基于日期获取所有日期 - 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”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签postgresqloraclesql-serverdb2、... edit您的问题并添加一些sample data 和基于该数据的预期输出。 Formatted text 请no screen shots。 (edit 您的问题 - 在 cmets 中不要邮政编码或其他信息) 我已经编辑了我的问题 也许这是一个很好的起点:sqlservercentral.com/articles/calendar/145206 【参考方案1】:

在范围之间生成日期的另一种方法可能类似于以下查询。与CTEWHILE 循环相比,这将更快。

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 =, !=, &lt;, &lt;= , &gt;, &gt;= 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 &lt; 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”的表。它有四... 查看详情