如何使用 GETDATE

问题描述

我正在用 sql 编写一个标量变量来定义一个季节年(从日历年的一半开始)。它需要随着日期的变化而变化,即该日期为 2021 年,2022 年 6 月 1 日则应更改为 2022 年。

它正在生成错误代码

错误引用函数‘GETDATE’:用户定义函数中不允许非确定性、安全性和元数据函数调用。”

我在网上看不到任何可以详细处理该问题的解决方法。有什么想法吗?

代码是:

CREATE FUNCTION CDP.fn_SeasonYear
(
)
RETURNS INT
       AS 
       BEGIN
              DECLARE @ThisSeason INT
       SET @ThisSeason = 
       CASE
              WHEN DatePart(Month,GETDATE()) < 6
              THEN CONVERT(int,DatePart(Year,GETDATE()) -1)
              ELSE CONVERT(int,GETDATE()))
       End

RETURN @ThisSeason
END;

解决方法

GETDATE() 是 MS SQL Server。你应该这样标记问题。您可能应该指出您拥有的 SQL Server 版本,因为该功能在 SQL Server 2017 中运行良好:

SET NOCOUNT ON;
SELECT @@VERSION;
GO
DROP FUNCTION IF EXISTS dbo.fn_SeasonYear;
GO
CREATE FUNCTION dbo.fn_SeasonYear()
RETURNS INT
AS 
BEGIN
  DECLARE @ThisSeason INT;
  SET @ThisSeason = 
    CASE
      WHEN DatePart(Month,GETDATE()) < 6
        THEN CONVERT(INT,DatePart(Year,GETDATE()) -1)
      ELSE CONVERT(INT,GETDATE()))
    END;
RETURN @ThisSeason;
END;
GO
SELECT  dbo.fn_SeasonYear();

/*
OUTPUT:
----------------------------------------------------------------------------
Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) 
    Aug 22 2017 17:04:49 
    Copyright (C) 2017 Microsoft Corporation
    Express Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)

-----------
2021
*/
,

这并不理想,但这是我使用过的一种方法。如前所述,函数需要在给定相同输入的情况下返回相同的值。您将 getdate() 作为参数传递给函数。

CREATE FUNCTION dbo.fn_SeasonYear( @currdate datetime )

RETURNS INT
       AS 
       BEGIN
              DECLARE @ThisSeason INT
       SET @ThisSeason = 
       CASE
              WHEN DatePart(Month,@currdate) < 6
              THEN CONVERT(int,@currdate) -1)
              ELSE CONVERT(int,@currdate))
       End

RETURN @ThisSeason
END;