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