6

在sql中,如何获取特定月份的开始和结束日期。你能帮助我吗。

4

5 回答 5

7

以下将适用于您认为一周的第一天(周日、周一等),SET DATEFIRST如果您想更改默认设置,请确保使用。SET DATEFIRST 1将使一周的第一天成为星期一。

SELECT  DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekStart],
        DATEADD(DAY, 7 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) [WeekEnd]

编辑

我刚刚重新阅读了您的请求,我认为您可能会追求与我上面给出的不同的东西。如果您想要每月的第一天和最后一周的星期几,这将起到作用:

SELECT  DATENAME(WEEKDAY, DATEADD(DAY, 1 - DATEPART(DAY, GETDATE()), GETDATE())) [FirstDayOfMonth],
        DATENAME(WEEKDAY, DATEADD(DAY, - DATEPART(DAY, DATEADD(MONTH, 1, GETDATE())), DATEADD(MONTH, 1, GETDATE()))) [LastDayOfMonth]
于 2012-04-04T14:13:25.940 回答
6

要获得一周的第一天使用:

select dateadd(wk, datediff(wk, 0, getdate()), 0)

最后一天将是第一天 + 6:

select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6

警告:这是文化敏感的。检查@@datefirst上的文档

于 2012-04-04T09:01:00.597 回答
1

您的要求不清楚:您认为一周的第一天和最后几天是什么?周日和周六?星期一和星期五?周一和周日?但是对于许多与日期相关的查询,最好的解决方案是创建一个日历表。这使您能够根据您的定义轻松设置周、月和年的第一天和最后一天,必要时甚至可以设置多种格式。

如果您使用诸如财政年度、工作日等定义因国家甚至公司而异的概念,这将特别有用。当您的逻辑有例外时,这也是最简单的解决方案,例如,一年中的第一周与“正常”周有不同的规则。

使用日历表,您可以预先填充一周的第一天和最后一天,然后您的查询可能是这样的:

-- first/last days stored as dates in their own columns
select FirstDayOfThisWeek, LastDayOfThisWeek
from dbo.Calendar
where BaseDate = @SomeDate

-- first/last days stored as bit flags
select max(BaseDate)
from dbo.Calendar
where BaseDate <= @SomeDate and IsFirstDayOfWeek = 0x1
于 2012-04-04T09:36:22.297 回答
1

下面是一个案例语句,您可以使用它来为您的日期值创建一个 Weekbegin。这将使您的星期从星期一、星期二或星期三...等开始,具体取决于您设置为@pDate 的星期几。

创建参数

DECLARE @pDate Date = NULL --Replace with your date, which will also be the first day of the week
DECLARE @pDatePart SMALLINT = DATEPART(dw, @pDate)

然后在您的选择之后放置这个案例声明

CASE 
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN @pDatePart  AND 7 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+@pDatePart, CAST(DATEVALUE AS DATE))
    WHEN DATEPART(dw, CAST(DATEVALUE AS DATE)) BETWEEN 1 AND @pDatePart-1 THEN DATEADD(d, (DATEPART(dw, CAST(DATEVALUE AS DATE))*-1)+(@pDatePart-7), CAST(DATEVALUE AS DATE))
    END
    AS DynamicWeekBegin

您总是可以通过使用 dateadd(d, 6, THE CASE STATEMENT) 获得一周的最后日期

于 2017-08-01T09:08:35.660 回答
0

这里我给

周、月、季度、半年、年开始和结束日期。

     Select CONVERT(varchar(50), GETDATE(),105) 'GETDATE' ,
       CONVERT(varchar(50), DATEADD(DAY, 2 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)),105) [WeekStart],
CONVERT(varchar(50),DATEADD(DAY, 8 - DATEPART(WEEKDAY, GETDATE()), CAST(GETDATE() AS DATE)) ,105)[WeekEnd],
CONVERT(varchar(50),DATEADD(dd, -DAY(getdate()) + 1, getdate()),105) MonthStart,
CONVERT(varchar(50),DATEADD(dd, -DAY(DATEADD(mm, 1, getdate())), DATEADD(mm, 1, getdate())),105) MonthStart,
CONVERT(varchar(50), DATEADD(q, DATEDIFF(q, 0, GETDATE()), 0),105)  AS 'QStart Date',      
CONVERT(varchar(50), DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, GETDATE()) + 1,0)),105) AS 'QEnd Date',
CONVERT(varchar(50), CAST(CAST(((((MONTH(GETDATE()) - 1) / 6) * 6) + 1) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105) StartOfHalfYear,
CONVERT(varchar(50),  CAST(CAST(((((MONTH(GETDATE()) - 1) / 6) * 6) + 6) AS VARCHAR) + '-1-' + CAST(YEAR(GETDATE()) AS VARCHAR) AS DATETIME),105)EndOfHalfYear,
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()), 0),105) AS StartOfYear,
CONVERT(varchar(50), DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, -1),105) AS EndOfYear
于 2014-11-17T10:51:30.423 回答