日历周的ODBC函数?

时间:2012-03-08 13:05:02

标签: sql sql-server sql-server-2008 sql-server-2005 odbc

关于ODBC函数的问题:

我需要从SQL日期时间获得ISO 8601日历周。 在SQL-Server中,其语法如下:

SELECT DATEPART(ISO_WEEK, GETDATE()) 

在SQL Server 2005中,ISO_WEEK不存在,所以我必须使用这样的函数: http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server

现在我的问题: 为了保持数据库独立, 是否可以通过 ODBC 功能获得 ISO日历周

ODBC-这样的函数(当然除了getdate):

SELECT 
 GETDATE() AS vT_SQL_DateTime_NonDeterministic_Function 

,{ fn NOW() } AS vODBC_DateTime_Canonical_Function 
,{ fn CURDATE() } AS vODBC_DateOnly_Canonical_Function 
,CAST(FLOOR(CAST(GETDATE() AS float)) AS datetime) AS vFloor_Mine 
,CONVERT(char(8),  { fn NOW() }, 112) AS v112_ISO 
,CONVERT(char(10), { fn NOW() }, 104) AS v104_Thomas 
,{ fn CONVERT({fn CURDATE()}, SQL_DATE)} AS vODBC_Proper 

-- Testing ODBC functions & syntax
,{ fn CONCAT('abc', 'def')} AS ODBC_Concat
,{ fn CONCAT(NULL, 'def')}  AS ODBC_Concat_NullLeft
,{ fn CONCAT('abc', NULL)}  AS ODBC_Concat_NullRight
,{ fn CONCAT(NULL, NULL)}   AS ODBC_Concat_NullBoth
,{ fn LENGTH('abc')}    AS ODBC_Length
,{ fn UCASE('abc')} AS ODBC_UCASE
,{ fn LCASE('ABC')} AS ODBC_LCASE
,{ fn SUBSTRING('Test me', 1, 4)} AS ODBC_SUBSTRING 
,{ fn LOCATE('in', 'needle in the haystack')}  AS ODBC_Locate 
,{ fn SUBSTRING('Test me', 1, { fn LOCATE(' me', 'Test me') } - 1)} AS ODBC_SUBSTRING_Locate

2 个答案:

答案 0 :(得分:3)

编辑:(提问者)
这是产生的ODBC等价物,这是我的问题的实际答案:

({fn DAYOFYEAR({fn TIMESTAMPDIFF(SQL_TSI_DAY, 0, dt) } / 7 * 7 + 3)}+6) / 7 AS ODBC_ISO_WEEK

- 结束编辑

这是在sql-server 2005或2000中获得iso_week的更好方法

CREATE function f_isoweek(@date datetime) 
RETURNS INT 
as 
BEGIN 

RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7 

END 

在这里阅读更多内容:

Isoweek in SQL Server 2005

编辑:有人声称我的脚本失败后,我添加了这个脚本证明它的工作原理:

--This script will run on mssql server 2008, 
--it will show all rows where isoweek is calculated wrong with the given formular (0 rows)

;with a as
(
select cast('1900-01-01' as datetime) d
union all
select dateadd(day, 1, d) from a
where d < '2100-01-01'
)
select count(*) 
from a 
where (datepart(DY, datediff(d, 0, d) / 7 * 7 + 3)+6) / 7
<> datepart(iso_week, d)
option (maxrecursion 0)

答案 1 :(得分:-1)

有一段时间没有与2005年合作过,但是不会这样做吗?

SELECT DatePart(week,GETDATE())

您可能希望确保将SQL Server设置为在星期一开始一周(SET DATEFIRST)以匹配ISO逻辑。