在sql中,如何获取特定月份的开始和结束日期。你能帮帮我吗?
答案 0 :(得分:6)
要获得一周的第一天使用:
select dateadd(wk, datediff(wk, 0, getdate()), 0)
最后一天将是第一天+6:
select dateadd(wk, datediff(wk, 0, getdate()), 0) + 6
警告:这是文化敏感的。查看@@datefirst
上的文档答案 1 :(得分:5)
以下内容适用于您考虑的一周中的第一天(星期日,星期一等),如果您想要更改默认值,请确保使用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]
答案 2 :(得分:1)
您的要求不清楚:您认为一周的第一天和最后几天是什么?周日和周六?周一和周五?周一和周日?但是,许多与日期相关的查询的最佳解决方案是创建calendar table。这使您能够根据您的定义轻松设置数周,数月和数年的第一天和最后几天,甚至可以根据需要设置多种格式。
如果您使用财务年度,工作日等概念,这些定义因国家/地区甚至公司而异,则此功能特别有用。当您的逻辑存在例外情况时,这也是最简单的解决方案,例如:一年中的第一周与“正常”周有不同的规则。
使用日历表,您可以预先填充一周的第一天和最后一天,然后您的查询可能是这样的:
-- 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
答案 3 :(得分: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,案例陈述)
答案 4 :(得分: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