目前,其中一个报告会读取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过滤结果。
我该怎么做?
答案 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周编号和您自己的内部周编号方案。如果逻辑发生变化,您也可以轻松更改表中的值,而无需更改任何代码。
作为一般观察,日历表通常是比内联函数更好的解决方案,特别是如果您的要求涉及报告。