Функция ODBC для календарной недели? - PullRequest
1 голос
/ 08 марта 2012

Вопрос по функциям ODBC:

Мне нужно получить календарную неделю ISO 8601 из даты-времени SQL.В SQL-сервере синтаксис для этого таков:

SELECT DATEPART(ISO_WEEK, GETDATE()) 

в SQL Server 2005, ISO_WEEK не существует, поэтому я должен использовать такую ​​функцию: http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server

Теперь мой вопрос: чтобы сохранить независимость от базы данных, возможно ли получить календарную неделю ISO с помощью функции ODBC ?

Подобные 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 ]

3 голосов
/ 08 марта 2012

Редактировать: (по запросу)
И это итоговый эквивалент ODBC, который является фактическим ответом на мой вопрос:

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

- Конец Правки

Вот лучший способ получить iso_week в sql-server 2005 или 2000

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

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

END 

Подробнее здесь:

Isoweek в 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)
0 голосов
/ 08 марта 2012

некоторое время не работал с 2005, но разве это не сработало?

SELECT DatePart (week, GETDATE ())

вы можете убедиться, что ваш SQL Server настроен на начало недели в понедельник (SET DATEFIRST) в соответствии с логикой ISO.

...