【问题标题】:To Create a Function to split dates into Year, Month, Date into a separate column in SQL在 SQL 中创建一个函数以将日期拆分为年、月、日期到单独的列中
【发布时间】:2018-09-10 18:17:02
【问题描述】:

尝试创建一个函数将“2018-05-21”的日期格式拆分为2018 | 05 | 21 |作为三个单独的列。尝试创建如下函数,但在“月”、“日”出现错误。错误提示“'month' 附近的语法不正确。需要 '(' 或 Select。”

CREATE FUNCTION [dbo].[functionname]
(
    -- Add the parameters for the function here
    @DateFormat AS DATETIME
)
RETURNS VARCHAR (MAX)
AS
    BEGIN
        RETURN  DATEPART(YEAR,@DateFormat),
                DATEPART(Month,@DateFormat),
                DATEPART(Day,@DateFormat)

    END
GO

【问题讨论】:

  • 为什么要为此创建一个函数?
  • 这样其他人也可以调用它,当他们想在任何类型的分析中直接使用它时,或者有更好的格式可以使用。
  • 我确实直接在桌子上试过这个。它确实有效。 /* DATEPART(year,Date) as year, DATEPART(month,Date) as Month, DATEPART(DD,Date) as Date */
  • 如果您已经将日期格式化为 - 您可以进行替换(日期,'-','|')
  • 可能不是您想要的方式,可以在选择查询中的各个行上使用...交叉应用答案可能会完成工作,但是任何可以编写 APPLY 语句的人也知道如果需要,如何调用 MONTH()。

标签: sql tsql sql-server-2008


【解决方案1】:

当前 SQL 的问题是标量只返回一个值。您需要使用表值函数来获取多个列。

这是一个 TVF 版本,将提供三列

CREATE FUNCTION [dbo].[FunctionName]
(
    @DateFormat AS DATETIME
)
RETURNS TABLE AS RETURN
(
    SELECT DATEPART(YEAR,@DateFormat) AS [Year],
       DATEPART(Month,@DateFormat) AS [Month],
       DATEPART(Day,@DateFormat) AS [Day]
)

示例用法:

DECLARE @dates TABLE (SomeDate DATE)
INSERT INTO @dates SELECT '01/25/2018'
INSERT INTO @dates SELECT '10/01/2008'

SELECT d.*,fn.* FROM @dates d
CROSS APPLY [dbo].[FunctionName](d.SomeDate) fn

还有一些documentation

也就是说,我个人不喜欢这种实现方式。我只希望 SQL 的 SELECT 部分中有 DATEPART 语句。我认为 TVF 让它变得更加复杂,并且没有提供任何切实的好处。

【讨论】:

  • 打败我!但它就在那里。
  • 完美!这行得通。我有个问题。如果选择要查看的某些列并应用 TVF,则除了 select 语句中的选定列之外,我看不到 o/p。例如,如果我给 SELECT Column1,Column2, Column3 from [Tablename] CROSS APPLY [dbo].[FunctionName](columnname)
  • @Tamil 为函数调用添加别名,你可以指定你想要的 alias.column 字段。我已经更新了我的示例以显示这一点。
  • @UnhandledExcepSean 谢谢!!完美运行!
猜你喜欢
  • 2019-09-10
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 2018-04-21
  • 2011-09-26
  • 1970-01-01
  • 2019-02-20
相关资源
最近更新 更多