【问题标题】:'DATEFROMPARTS' is not a recognized built-in function name- SQL Server 2008 error'DATEFROMPARTS' 不是可识别的内置函数名称 - SQL Server 2008 错误
【发布时间】:2020-12-06 00:57:16
【问题描述】:
Declare  @i int=1;
select FORMAT(DATEFROMPARTS(1900, @i, 1), 'MMM', 'en-US')

在 SQL Server 2008 中执行时出现错误。

'DATEFROMPARTS' 不是可识别的内置函数名称。

【问题讨论】:

  • 这是 SQL Server 2012 中的新功能,在旧版本中不可用。
  • 你还会发现 FORMAT 在那里不起作用

标签: sql sql-server-2008 sql-function


【解决方案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 函数含义。

【讨论】:

  • CLR 将月份数字映射到 12 个可能的字符串之一似乎有点过分了
  • @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)

【讨论】:

  • 这不等同于原始代码。你需要一个LEFT(,3)
  • @MartinSmith。 . .谢谢你。当我回答这个问题时,我确实读了'MMMM' 而不是'MMM'
  • 没问题。提前恭喜您达到 100 万代表!
  • @MartinSmith。 . .还不是。 . .在我写这 999,325 的时候。
【解决方案3】:

您调用的内置函数都不存在于 SQL Server 2008 中

就我个人而言,我不会费心从月份编号构造一个日期,然后调用一个函数来获取缩写的月份字符串。

你可以使用

SELECT SUBSTRING('JanFebMarAprMayJunJulAugSepOctNovDec',@i*3-2,3)

【讨论】:

    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 2014-06-12
    • 2014-01-25
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多