关于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
答案 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
在这里阅读更多内容:
编辑:有人声称我的脚本失败后,我添加了这个脚本证明它的工作原理:
--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逻辑。