我正在尝试编写一个sql查询,以mm / count / yyyy的格式获取上周的计数。在我的情况下,星期三开始新的一周。因此,今天3月8日,2012年是3月的第二周,上周的计数是03/01/2012。请注意,01表示周数不是日期。如果考虑到2012年3月1日,那么最后一周的计数应该是2月2日的最后一周,即2012年5月2日
更新:感谢史蒂夫的评论,提醒我在这里澄清我的问题。每个月从它的第一个星期三开始。所以03/01/2012从2012年3月7日到2012年3月13日开始
任何sql查询解决方案?
我正在使用sql-server
答案 0 :(得分:2)
这是一些让你入门的日期逻辑。我无法通过这两个例子来理解你的“上周计数”定义,所以我无法对其进行编码。
DECLARE
@Now datetime,
@Today datetime,
@MonthStart datetime,
@WeekCount int,
@Result varchar(10)
SET @Now = GetDate()
SET @Today = DateAdd(dd, DateDiff(dd, 0, @Now), 0)
SET @MonthStart = DateAdd(mm, DateDiff(mm, 0, @Today), 0)
-- relative to the actual day the month started
SET @WeekCount = ((DatePart(dd, @Today)-1) / 7) + 1
-- relative to Sunday
--SET @WeekCount = (DatePart(week, @Today) - (DatePart(week, @MonthStart) + 1
SET @Result = convert(varchar(10), @Today, 101)
SET @Result =
LEFT(@Result, 3) -- month/
+ RIGHT('z00' + convert(varchar(2), @WeekCount), 2) -- week with zero pad
+ RIGHT(@Result, 5) -- /year
SELECT
@Now as TheNow,
@Today as Today,
@MonthStart as MonthStart,
@WeekCount as WeekCount,
@Result as Result
答案 1 :(得分:1)
:
select to_char( sysdate, 'w' ) from dual
答案 2 :(得分:1)
@Steven,
抱歉,这不适合作为评论。
您对“[月]的[第n周]”的描述不清楚。你的一周从星期三开始。 2月1日是星期三,所以2012年2月的几周,如果确实有5个星期,那么
您将3月8日描述为“三月的第二周”,因此3月的第一周必须是前一周,即2月29日 - 3月6日。请注意,这也是您所说的“最后一周”(五月一周。“
根据您的描述,您写为'02 / 05/2012'和'03 / 01/2012'的周数同一周具有不同的名称。
让您知道
的规则是什么或者你的问题是否存在错误。
一旦您可以描述您的需求,就可以轻松编程。如果您不知道自己想要什么,就无法进行编程。
答案 3 :(得分:0)
在SQL Server中,这些查询返回1,1,2,5
select ((DATEPART(dd, 'March 01, 2012')-1)/7) + 1
select ((DATEPART(dd, 'March 07, 2012')-1)/7) + 1
select ((DATEPART(dd, 'March 08, 2012')-1)/7) + 1
select ((DATEPART(dd, 'March 31, 2012')-1)/7) + 1
所以这可能是你需要的
declare @dt datetime = 'March 31, 2012'
select
CONVERT(nvarchar(4), DATEPART(month,@dt)) + '/' +
CONVERT(nvarchar(4), ((DATEPART(dd, @dt)-1)/7) + 1) + '/' +
CONVERT(nvarchar(4), DATEPART(year,@dt))
产生'3/5/2012'
答案 4 :(得分:0)
SELECT
RIGHT(100 + MONTH(D) , 2) + '/' +
RIGHT(100 + (DAY(D) + 6) / 7, 2) + '/' +
DATENAME(YEAR, D)
FROM (
SELECT DATEADD(WEEK, -1, GETDATE()) AS D
) s
答案 5 :(得分:0)
我认为应该这样做,我没有得到上周的价值,因为它令人困惑,答案更清晰,你可以在某处添加DATEADD(day,-7,date)
。
SET DATEFORMAT YDM
CREATE TABLE #Dates (Date DATETIME)
INSERT INTO #Dates VALUES ('2012-31-03');
INSERT INTO #Dates VALUES ('2012-15-02');
INSERT INTO #Dates VALUES ('2012-02-04');
INSERT INTO #Dates VALUES ('2012-02-05');
WITH Mondays as (
SELECT DATEADD(week, DATEDIFF(week,0, DATEADD(day,6-DATEPART(day,d.Date),d.Date) ), 0) FirstMonday,
DATEADD(week, DATEDIFF(week,0, DATEADD(day,6-DATEPART(day,DATEADD(month, -1, d.Date)),DATEADD(month, -1, d.Date)) ), 0) FirstMondayOfLastMonth,
d.Date
FROM #Dates d),
Wednesday as (
SELECT CASE WHEN DATEPART(day,m.FirstMonday) <= 5
THEN DATEADD(day,2,m.FirstMonday)
ELSE DATEADD(day,-5,m.FirstMonday) END FirstWednesday,
CASE WHEN DATEPART(day,m.FirstMondayOfLastMonth) <= 5
THEN DATEADD(day,2,m.FirstMondayOfLastMonth)
ELSE DATEADD(day,-5,m.FirstMondayOfLastMonth) END FirstWednesdayOfLastMonth,
m.Date
FROM Mondays m)
SELECT w.Date,
CASE WHEN w.Date >= w.FirstWednesday THEN
RIGHT('0' + CAST(DATEPART(month,w.Date) AS NVARCHAR(2)),2)
+ '/0' + CAST(DATEDIFF(week,w.FirstWednesday, w.Date) + 1 AS NVARCHAR(2))
+ '/' + CAST(DATEPART(year,w.Date) AS NVARCHAR(4))
ELSE
RIGHT('0' + CAST(DATEPART(month,w.FirstWednesdayOfLastMonth) AS NVARCHAR(2)),2)
+ '/0' + CAST(DATEDIFF(week,w.FirstWednesdayOfLastMonth, w.Date) + 1 AS NVARCHAR(2))
+ '/' + CAST(DATEPART(year,w.FirstWednesdayOfLastMonth) AS NVARCHAR(4))
END AS weekDate
FROM Wednesday w
DROP TABLE #Dates
结果是: 日期周日日期
2012-03-31 00:00:00.000 03/04/2012
2012-02-15 00:00:00.000 02/03/2012
2012-04-02 00:00:00.000 03/05/2012
2012-05-02 00:00:00.000 05/01/2012