示例:
'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
。
那么,我怎样才能得到正确的结果?
答案 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
答案 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日)