如何使用sql语句获取上周计数?

时间:2012-03-08 21:06:27

标签: sql sql-server

我正在尝试编写一个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

6 个答案:

答案 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

另见SET DATEFIRST

答案 1 :(得分:1)

在oracle中

select to_char( sysdate, 'w' ) from dual

答案 2 :(得分:1)

@Steven,

抱歉,这不适合作为评论。

您对“[月]的[第n周]”的描述不清楚。你的一周从星期三开始。 2月1日是星期三,所以2012年2月的几周,如果确实有5个星期,那么

  1. 2月1日至7日
  2. 2月8日至14日
  3. 2月15日至21日
  4. 2月22日至28日和
  5. 2月29日 - 3月6日
  6. 您将3月8日描述为“三月的第二周”,因此3月的第一周必须是前一周,即2月29日 - 3月6日。请注意,这也是您所说的“最后一周”(五月一周。“

    根据您的描述,您写为'02 / 05/2012'和'03 / 01/2012'的周数同一周具有不同的名称。

    让您知道

    的规则是什么
    1. 3月1日运行3月1日的程序时,你想要“上周”。
    2. 你想要在这两种情况下以不同的方式描述那个星期(相同)。
    3. 或者你的问题是否存在错误。

      一旦您可以描述您的需求,就可以轻松编程。如果您不知道自己想要什么,就无法进行编程。

答案 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