線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3914
推到 Plurk!
推到 Facebook!

MS-SQL取week不正确(第几周)

答題得分者是:老大仔
leonli80
一般會員


發表:29
回覆:27
積分:11
註冊:2006-08-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-03-24 16:49:31 IP:222.72.xxx.xxx 訂閱
select datepart(week, getdate()) 返回为13 (错误),而在delphi的WeekOfTheYear(now) 却是返回12 (正确)。如何能解决这种不一致的问题?
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-03-24 17:04:46 IP:59.120.xxx.xxx 未訂閱
SQL的說為以下:
week (wk, ww) 日期部份反映了對 SET DATEFIRST 所做的變更。任何年份的 1 月 1 日定義了 week 日期部份的開始數字,例如:DATEPART(wk, 'Jan 1, xxxx') = 1,其中 xxxx 是任何年份。

"感覺"上...SQL資料庫是以今年的一月一日當天的當週為第一個星期
照這樣算下來
這星期就會是第13週了

請試試以下:

[code sql]
SET DATEFIRST 5
select datepart(week, getdate())
[/code]

以上僅供參考~

===================引 用 leonli80 文 章===================
select datepart(week, getdate()) 返回为13 (错误),而在delphi的WeekOfTheYear(now) 却是返回12 (正确)。如何能解决这种不一致的问题?
編輯記錄
老大仔 重新編輯於 2010-03-24 17:14:36, 註解 無‧
leonli80
一般會員


發表:29
回覆:27
積分:11
註冊:2006-08-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-03-24 23:33:48 IP:118.133.xxx.xxx 訂閱
SET DATEFIRST 是用来设置每周从星期几开始的,所以无法达到效果。

拿2010-01-01来说,DELPHI是按国标把1,2号归在上年的最后一周的。而MS_SQL里面是从1-1号算第1周。
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-02 12:28:13 IP:211.75.xxx.xxx 未訂閱
依據ISO 8601 一年的第一週至少有四天
也就是說 以星期日為一週的第一天為例:
1/1 若在星期四至六之間
將 datepart結果 -1

[code sql]
declare @date as datetime
declare @year as int
declare @firstdate as varchar(10)

set @date = getdate()
set @year = year(@date)
set @firstdate = cast(@year as varchar(4)) '/1/1'
if ( datepart(weekday, @firstdate) >= 5 ) or (datepart(weekday, @firstdate) <= 7 )
select datepart(week, @date) - 1
else
select datepart(week, @date)
[/code]

===================引 用 leonli80 文 章===================
SET DATEFIRST 是用来设置每周从星期几开始的,所以无法达到效果。

拿2010-01-01来说,DELPHI是按国标把1,2号归在上年的最后一周的。而MS_SQL里面是从1-1号算第1周。
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2010-04-02 12:41:53, 註解 無‧
eaglewolf 重新編輯於 2010-04-02 12:42:24, 註解 無‧
熾冰
一般會員


發表:29
回覆:21
積分:10
註冊:2004-01-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-03-03 11:39:24 IP:220.130.xxx.xxx 訂閱

===================引 用 eaglewolf 文 章===================
依據ISO8601 一年的第一週至少有四天
也就是說 以星期日為一週的第一天為例:
1/1 若在星期四至六之間
將 datepart結果 -1

[code sql]
declare @date as datetime
declare @year as int
declare @firstdate as varchar(10)

set @date = getdate()
set @year = year(@date)
set @firstdate = cast(@year as varchar(4)) '/1/1'
if ( datepart(weekday, @firstdate) >= 5 ) or (datepart(weekday, @firstdate) <= 7 )
select datepart(week, @date) - 1
else
select datepart(week, @date)
[/code]

由於 eaglewolf 的語法有瑕疵
我試了2012/1/1 由於這個日期落在星期日,
所以應該取的第一周,但是結果還是第零周
我做了小修正
只是將 or 改用 and

[code sql]
declare @date as datetime
declare @year as int
declare @firstdate as varchar(10)

set @date = getdate()
set @year = year(@date)
set @firstdate = cast(@year as varchar(4)) '/1/1'
if ( datepart(weekday, @firstdate) >= 5 ) and (datepart(weekday, @firstdate) <= 7 )
select datepart(week, @date) - 1
else
select datepart(week, @date)
[/code]

最好的測試日期是 2014/1/1 是星期三 為第一周
2015/1/1 是星期三 為第零周
編輯記錄
熾冰 重新編輯於 2011-03-02 20:45:37, 註解 無‧
系統時間:2024-04-26 3:58:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!