#sql #sql-server-2008 #sql-function
#sql #sql-server-2008 #sql-функция
Вопрос:
Declare @i int=1;
select FORMAT(DATEFROMPARTS(1900, @i, 1), 'MMM', 'en-US')
Я получаю сообщение об ошибке при выполнении в SQL Server 2008.
‘DATEFROMPARTS’ не является распознанным именем встроенной функции.
Комментарии:
1. Это новая функция в SQL Server 2012 , и она недоступна в более старых версиях.
2. вы также обнаружите, что ФОРМАТ там не работает
Ответ №1:
DATEFROMPARTS
был введен в SQL Server 2012. SQL Server 2008 (неподдерживаемая версия SQL Server) ничего не знает об этой функции. Если вам нужна эта функциональность в SQL 2008, вам нужно будет создать свою реализацию. Пример:
CREATE FUNCTION dbo.udf_DateFromParts (@year int, @month int, @day int)
RETURNS date
AS
BEGIN
RETURN DATEADD(day, @day-1, DATEADD(month, @month-1, DATEADD(year, @year-1, CAST('0001-01-01' AS date))));
END;
GO
Аналогично, FORMAT
также было введено в SQL Server 2012. Для этого вам понадобится значение функции SQLCLR.
Комментарии:
1. CLR кажется излишним для сопоставления номера месяца с одной из 12 возможных строк
2. @MartinSmith, это верно для данного конкретного варианта использования. Я думал о замене всей
FORMAT
функциональности.
Ответ №2:
Если вам нужно название месяца, используйте datename()
:
select left(datename(month,
convert(date,
convert(varchar(255), 19000001 @i * 100
)
)
), 3)
Явное преобразование в date, с технической точки зрения, не требуется:
select left(datename(month, convert(varchar(255), 19000001 1 * 100)), 3)
Комментарии:
1. Это не эквивалентно исходному коду. Вам потребуется
LEFT(,3)
2. Нет проблем. Заранее поздравляем с достижением 1 миллиона повторений!
3. @MartinSmith . . . Пока нет . . . когда я пишу это 999 325.
Ответ №3:
Ни одна из вызываемых вами встроенных функций не существует в SQL Server 2008
Лично я бы не стал утруждать себя построением даты из номера месяца, а затем вызовом функции для получения сокращенной строки месяца в любом случае.
Вы можете использовать
SELECT SUBSTRING('JanFebMarAprMayJunJulAugSepOctNovDec',@i*3-2,3)