使用T-SQL获取下个月的第一个星期日

时间:2009-10-01 19:44:13

标签: sql sql-server tsql

寻找一种方式以“11/1/2009”格式获取日期,这将是下个月的第一个星期日。我希望在10月的第一个星期日之后运行这个查询,以获得即将到来的月份的第一个星期日。使用T-SQL查询实现此目的的最佳方法是什么?

由于

9 个答案:

答案 0 :(得分:7)

试试这个:

Declare @D Datetime 
Set @D = [Some date for which you want the following months' first sunday]
Select DateAdd(day, (8-DatePart(weekday, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)))%7, 
    DateAdd(Month, 1+DateDiff(Month, 0, @D), 0))

编辑笔记:

下个月的第一个月由表达式给出:

DateAdd(Month, 1+DateDiff(Month, 0, @D), 0)

或通过: 可以通过将1更改为2来修改,以便从现在开始两个月的第一个月:

DateAdd(Month, 2+DateDiff(Month, 0, @D), 0) 

编辑:回应@NissanFan和@Anthony:修改此项以返回星期三的第一个星期一等,将值8更改为9,10,11等....

Declare @Sun TinyInt Set @Sun = 8
Declare @Mon TinyInt Set @Mon = 9
Declare @Tue TinyInt Set @Tue = 10
Declare @Wed TinyInt Set @Wed = 11
Declare @Thu TinyInt Set @Thu = 12
Declare @Fri TinyInt Set @Fri = 13
Declare @Sat TinyInt Set @Sat = 14
Declare @D Datetime, @FONM DateTime -- FirstofNextMonth 
Set @D = [Some date for which you want the following months' first sunday]
Set @FONM = DateAdd(Month, 1+DateDiff(Month, 0, @D),0)

Select 
  DateAdd(day, (@Sun -DatePart(weekday, @FONM))%7, @FONM) firstSunInNextMonth,
  DateAdd(day, (@Mon -DatePart(weekday, @FONM))%7, @FONM) firstMonInNextMonth,
  DateAdd(day, (@Tue -DatePart(weekday, @FONM))%7, @FONM) firstTueInNextMonth,
  DateAdd(day, (@Wed -DatePart(weekday, @FONM))%7, @FONM) firstWedInNextMonth,
  DateAdd(day, (@Thu -DatePart(weekday, @FONM))%7, @FONM) firstThuInNextMonth,
  DateAdd(day, (@Fri -DatePart(weekday, @FONM))%7, @FONM) firstFriInNextMonth,
  DateAdd(day, (@Sat -DatePart(weekday, @FONM))%7, @FONM) firstSatInNextMonth

答案 1 :(得分:1)

仅仅是一个FYI而不是提出一些代码来执行此操作如何使用日历表。

看看这个:http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

这也可能有所帮助: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=99696

答案 2 :(得分:1)

您可以使用DATENAME来确定您想要的日期,我可能会建议使用循环将日期从相关月份的01日移至第一个星期日。

所以试试吧:

DECLARE @DateTime DATETIME

设置为开始日期,然后添加1天,直到找到您要查找的内容。将datename与dw ...一起使用

我们已经用它来确定周末,但假期将是一个问题,我们使用表来存储它。

答案 3 :(得分:1)

以下是下个月第一个工作日的查询

DECLARE @DAYOFWEEK INT,@ReminderDate DateTime
SET @DAYOFWEEK = DATEPART( WEEKDAY,DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate())) )
Print @DAYOFWEEK
If @DAYOFWEEK = 1
Set @ReminderDate = DateAdd(D,- Day(GetDate())+2, DATEADD(M,1,GetDate()))
Else If @DAYOFWEEK =7
Set @ReminderDate = DateAdd(D,- Day(GetDate())+3, DATEADD(M,1,GetDate()))
Else
Set @ReminderDate = DateAdd(D,- Day(GetDate())+1, DATEADD(M,1,GetDate()))
Print @ReminderDate

答案 4 :(得分:0)

尝试将此代码作为函数:

-- Variables
DECLARE @DATE DATETIME
DECLARE @DAY INT
DECLARE @DAYOFWEEK INT
DECLARE @TESTDATE DATETIME

-- Set
SET @TESTDATE = GETDATE()
SET @DATE = DATEADD( MONTH, 1, @TESTDATE )
SET @DAY = DATEPART( DAY, @TESTDATE )
SET @DATE = DATEADD( DAY, -@DAY + 1, @DATE )
SET @DAYOFWEEK = DATEPART( WEEKDAY, @DATE )
IF @DAYOFWEEK > 1
BEGIN
    SET @DAYOFWEEK = 8 - @DAYOFWEEK
END
ELSE
BEGIN
    SET @DAYOFWEEK = 0
END

SET @DATE = DATEADD( DAY, @DAYOFWEEK, @DATE )

-- Display
PRINT @TESTDATE
PRINT @DAY
PRINT @DAYOFWEEK
PRINT @DATE

答案 5 :(得分:0)

以下是确定下个月第一个星期日的非系统特定方式:

首先,获取当前月份并添加一个月。 接下来,将该变量的日期设置为第一个。 接下来,找到该日期的日期值(假设星期一是1,星期日是7)。 接下来,从星期日(7)的日期值中减去当月1日的日值。

您现在拥有该月的第一个星期日和第一个星期日之间的天数。然后,您可以将其添加到日期变量以获取第一个星期日,或者,因为我们知道该月的第一个是1,您可以只添加一个差异(在上一步中找到),这是日期第一个星期天。 (你必须添加一个,因为它正在减去,因此如果给定月份的第一个是星期日,你最终会得到0)。

我一直在查看T-SQL文档,它对于如何使用我的方法一点都不直观,但是你需要“星期数”的概念才能使它工作无论什么

答案 6 :(得分:0)

这对于辅助日历表来说是最简单的。例如,请参阅this link

然而,它可以在没有一个的情况下完成,尽管它相当棘手。在这里,我假设您希望第一个未来日期是一个月的第一个星期日。我用变量@now写了这个 - 好 - 现在,所以它更容易测试。有可能写得更简单,但我认为这比快速编写更简单的解决方案更有可能是正确的。 [通过添加DAY(d)< 8]

SET @now = GETDATE();
WITH Seven(i) AS (
  SELECT -1 UNION ALL SELECT 0 UNION ALL SELECT 1
            UNION ALL SELECT 3 UNION ALL SELECT 4
            UNION ALL SELECT 5 UNION ALL SELECT 6
), Candidates(d) AS (
  SELECT DATEADD(WEEK,i+DATEDIFF(WEEK,'19000107',@now),'19000107')
  FROM Seven
) 
  SELECT TOP (1) d AS SoonestFutureFirstSunday
  FROM Candidates
  WHERE DAY(d) < 8 AND MONTH(d) >= MONTH(@now)
  AND (MONTH(d) > MONTH(@now) OR DAY(d) > DAY(@now)) 
  ORDER BY d;      ORDER BY d;

答案 7 :(得分:0)

我认为答案是这个

SELECT  DATEADD(Month, DATEDIFF(Month, 0, GETDATE()) + 1, 0) + 6 - (DATEPART(Weekday,
                  DATEADD(Month,
                      DATEDIFF(Month,0, GETDATE()) + 1, 0))
                  + @@DateFirst + 5) % 7 --FIRST sunday of following month

答案 8 :(得分:0)

<强> Reference taken from this blog:

SQL Server 2012引入了一个新的TSQL EOMONTH来返回包含指定日期的月份的最后一天以及可选的偏移量。

emplace