获取给定日期的周数

时间:2009-10-30 13:03:37

标签: ms-access vba

示例:

'DD/MM/YYYY
"1/1/2009" should give `1`
"31/1/2009" should give `5`
"1/2/2009" should also give `5`

Format("1/2/2009", "ww")返回6

那么,我怎样才能得到正确的结果?

7 个答案:

答案 0 :(得分:25)

我认为这里做的两件事与你的期望不符,我想: 假设你想要1月1日的周作为第1周,并使用星期日作为一周的第一天 所以第一周从2008年12月28日星期日到2009年1月3日星期六。

第6周将于2月1日星期日以此方法开始。

第1周的ISO标准是包含1月4日或一年中第一个星期四的ISO标准(表达同一事物的不同方式)。 您可以指定此计算方法和一周的第一天:

Format(SomeDate,"ww",vbMonday,vbFirstFourDays)

请参阅此处了解语法:

https://support.office.com/en-US/article/Format-Function-6F29D87B-8761-408D-81D3-63B9CD842530

答案 1 :(得分:5)

这可能有效:格式化(YourDate,“ww”,vbMonday)

答案 2 :(得分:5)

无论您的星期几周开始,您都需要传递明确的日期值。 “2009年1月31日”只能是一个日期(1月31日),但“1/2/2009”可能是1月2日(美国风格)或2月1日(所有其他人更有意义我们美国人)。

在这种情况下,我会使用DateSerial()来确保日期没有被误解:

  Format(DateSerial(2009,2,1), "ww", vbMonday)

虽然这不会导致您的问题,但由于Access有助于利用系统的本地化日期设置,我认为无论如何都应该这样做。你当然不得不在Access中的SQL中这样做,所以我认为这不是代码和表达式的坏习惯。

答案 3 :(得分:2)

“正确结果”取决于区域设置。也许VBA会让你选择一个日历系统,否则你几乎没有运气。

请注意,First-Day-On-xxDay不是您唯一的问题。整个星期的情况也有所不同,因此在另一个系统中,一个系统中的第1周可能第53周

因此要彻底测试,不要被诱惑为“纠正1”。

答案 4 :(得分:1)

周数有一个完整的标准:ISO-8601

http://en.wikipedia.org/wiki/ISO_8601#Week_dates

答案 5 :(得分:1)

我遇到了同样的问题。

显示第53周和第1周,但第53周和第1周的天数均在第1周

我首先尝试将Access Query中的日期格式更改为:

OrderWeek:格式([OrderDate]," yyyy-ww",1,3)< - 但它没有做到这一点。 您可以在第52周和2015-52之间获得2014-52的日期,这是第1周之前的。

排序也不是我喜欢的方式。它将数据分类为2014-1,2014-11,2014-2等。我希望它显示为2014-01,2014-02。2014-11等。

所以这是在Access Query中正确显示年份和星期的新代码:

ActualWeek: IIf(DatePart("ww",[SomeDate])=53,DatePart("yyyy",[SomeDate])+1,DatePart("yyyy",[SomeDate])) & "-" & IIf(DatePart("ww",[SomeDate])=53,"01",IIf(DatePart("ww",[SomeDate])<10,"0" & DatePart("ww",[SomeDate]),DatePart("ww",[SomeDate])))

现在显示从第53周起作为第1周的一部分的任何日子

答案 6 :(得分:0)

如果星期日是一周的第一天(因为它在某些地区),那么6是“1/2/2009”的正确周数(2009年2月1日)