【问题标题】:DATEPART as a parameter [duplicate]DATEPART 作为参数 [重复]
【发布时间】:2011-04-26 00:27:40
【问题描述】:

我猜这是不可能的,因为引擎不喜欢它,但有没有办法(禁止动态 SQL)将 DATEPART 作为参数传递给过程?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008 stored-procedures


    【解决方案1】:

    最好的解决方案是总是添加几个月(如果您需要在该级别上添加几天,甚至是几天)并使用整数值。像这样的

    DECLARE @AddMonths INT = 12
    SELECT 
      Sales_DateTime, DATEADD(DAY, -1, DATEADD(MONTH, @AddMonths, DATEADD(DAY, 1, Sales_DateTime ))) 
    FROM tSales
    

    我认为如何只添加一个月很清楚:)

    【讨论】:

      【解决方案2】:

      如果您尝试创建动态存储过程,以下代码可以帮助您实现这一目标。

      在定义sp的body时,记住需要使用exec sql关键字来执行sql语句:

      create proc sp_dinamic_procedure(@datepart_sql varchar(20), @datepart_var varchar(8) )
      as
      begin   
          declare @query varchar(100) 
          select @query = "select date from table1 t1 where datepart(" + @datepart_var + ", t1.fecha1) = " + @datepart_sql
          exec @query
      end
      

      然后您可以根据需要将任何 sql 语句作为单个字符串传递给您的存储过程:

      declare @datepart_sql varchar(20), @datepart_var varchar(8)
      select @datepart_sql = "datepart(year,getdate()", @datepart_var = "year"
      exec sp_dinamic_procedure @datepart_sql, @datepart_var
      

      【讨论】:

        【解决方案3】:

        一种选择是使用带参数的 CASE(最好使用 int 枚举而不是字符串):

        declare @part varchar(10)
        set @part = 'YEAR'
        select case @part 
                    when 'YEAR' then datepart(yy, SomeDateTimeColumn) 
                    when 'MONTH' then datepart(mm, SomeDateTimeColumn) 
                    else datepart(dd, SomeDateTimeColumn) 
                end
        from SomeTable
        

        【讨论】:

          【解决方案4】:

          没有。没有“年”数据类型。你可以这样做:

          CREATE PROC myproc @Year int, @Month tinyint
          

          这失败了,因为 DATEPART 部分是文字

          DECLARE @part varchar(10)
          SET @part = 'month'
          SELECT DATEPART(@part, GETDATE());
          

          或者这个和一个 IF ELSE

          CREATE PROC myproc @WhoeDate datetime, @part varchar(10) /* year. month etc*/
          

          【讨论】:

            【解决方案5】:

            为什么不能只传入从 Datepart 创建的 Date?

            DECLARE @datepart DATETIME
            SET @datepart = DATEPART(yyyy, GetDate())
            
            exec spName @datepart
            

            【讨论】:

            • 非常好的主意,我想你会是我的答案;但是,我想传入“YEAR”或“MONTH”,而不是一些看似任意日期。
            猜你喜欢
            • 1970-01-01
            • 2016-02-23
            • 2017-03-18
            • 2012-10-05
            • 2014-07-16
            • 2012-09-09
            • 2019-08-01
            • 2015-12-28
            • 1970-01-01
            相关资源
            最近更新 更多