创建week_ref编号以传递到存储过程

时间:2012-03-19 11:03:03

标签: sql sql-server sql-server-2008 tsql reporting

目前,其中一个报告会读取month_ref,其内容如下:

((DATEPART(yy, month_date) - 1200) * 100) + DATEPART(mm, month_date) AS month_ref,
month_date, DATENAME(MONTH, month_date) + ' ' + DATENAME(YEAR, month_date) AS month_name

我想创建类似week_ref的内容?

月份ref明确地标识了一年中的月份。当它传递到特定的存储过程时,sp将根据月份参考值过滤结果。

我现在想要创建一个周报 - (mon-sun)并且需要唯一地标识week_ref,以便我可以使用sp过滤结果。

我该怎么做?

4 个答案:

答案 0 :(得分:3)

这将为您提供从星期一到星期日每周的唯一号码,并且不依赖于datefirst。

SELECT datediff(day, 0, month_date) / 7 week_ref FROM <table>

这将返回一个始终在此处测试的整数:

SELECT SQL_VARIANT_PROPERTY(datediff(day, 0, getdate()) / 7, 'BaseType')

返回:

int

答案 1 :(得分:1)

虽然我认为这种技术很脏,但几个月它确实有效。这是因为一年中总有12个月。

几周以来它既脏又有缺陷。有些年份的周数比其他几周多,因为有些年份的时间超过一年。

我建议只使用DATEDIFF()

根据您希望几周开始的星期几,您需要进行一些计算......

  - Sun as start of week = DATEDIFF(WEEK, -1, yourDate  )  
  - Mon as start of week = DATEDIFF(WEEK, -1, yourDate-1)  
  - Tue as start of week = DATEDIFF(WEEK, -1, yourDate-2)  
  - Wed as start of week = DATEDIFF(WEEK, -1, yourDate-3)  
  - Thu as start of week = DATEDIFF(WEEK, -1, yourDate-4)  
  - Fri as start of week = DATEDIFF(WEEK, -1, yourDate-5)  
  - Sat as start of week = DATEDIFF(WEEK, -1, yourDate-6)  


我还建议您使用它来计算月份。 DATEDIFF(MONTH, <a base date>, <your date>),目前的一个非常笨重。


编辑将上面的值转回DATETIME

的示例
  - Sun as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate  ), -1  )
  - Mon as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-1), -1+1)
  - Tue as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-2), -1+2)
  - Wed as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-3), -1+3)
  - Thu as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-4), -1+4)
  - Fri as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-5), -1+5)
  - Sat as start of week = DATEADD(WEEK, DATEDIFF(WEEK, -1, yourDate-6), -1+6)

答案 2 :(得分:0)

使用

Select DATEPART(wk, GetDate())   --In your case month_date and not GetDate()

获取一年中的一周,然后您可以使用您喜欢的任何公式来创建week_ref,但是从我的编辑中可以看到,这是您唯一需要的东西。但是,您可以将month_ref更改为此类内容。

((DATEPART(yy, month_date) - 1200) * 10000) + (DATEPART(mm, month_date) * 100) + DATEPART(wk, month_date) AS month_ref

然后您不必添加额外的列

答案 3 :(得分:0)

使用calendar table和(至少)3列:base_date,month_ref和week_ref。然后,要获取特定日期的月份和周参考(无论是哪些),您可以直接从日历表中查询它们,而无需使用难以阅读的嵌套函数或其他“非显而易见”的代码:

select week_ref, month_ref
from dbo.calendar
where base_date = @my_date

您尚未解释week_ref和month_ref的实际含义,但如果它们只是数字,则日历表具有明显的优势,即它可以支持多种不同的定义。例如,您可能希望同时支持ISO周编号和您自己的内部周编号方案。如果逻辑发生变化,您也可以轻松更改表中的值,而无需更改任何代码。

作为一般观察,日历表通常是比内联函数更好的解决方案,特别是如果您的要求涉及报告。