【问题标题】:How to format manipulated DateTime fields in dynamic TSQL如何在动态 SQL 中格式化操作的 DateTime 字段
【发布时间】:2012-08-15 10:56:45
【问题描述】:

我有一个基本上看起来像这样的查询,它包含在一个动态查询中以适应可以更改的表名。我在中间转换了日期函数,但它不喜欢最后的 LoadedDateTime 和 CallPlacedTime。我已经尝试了引用我能想到的那些行的每一个转换和组合。我怎样才能做到这一点?

DECLARE @sql_TotalDialsNewLeads nvarchar(1000) = N'
 SELECT COUNT(*)
   FROM ' + @tbl_CH + ' ch, ' + @tbl_CL + ' cl, ' + @tbl_DA + ' da
  WHERE ch.IDENTITY = cl.IDENTITY
    AND cl.CRMID = da.CRMID
    AND CallPlacedTime BETWEEN ''' +  CONVERT(varchar(30),DATEADD(HOUR,-@TimezoneOffset,@StartDate),126) + '''
                           AND ''' +  CONVERT(varchar(30),DATEADD(HOUR,-@TimezoneOffset,@EndDate),126) + '''
    AND Product = ''' + @Product + '''
    AND Country = ''' + @Country + '''
    AND DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,LoadedDateTime))
      = DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,CallPlacedTime))'

 EXECUTE(@sql_TotalDialsNewLeads);

谢谢, 肖恩

【问题讨论】:

标签: tsql date datetime dynamic time


【解决方案1】:

尝试使用sp_executesql带参数而不是手动执行字符串:

...    
AND CallPlacedTime BETWEEN DATEADD(HOUR,-@TimezoneOffset,@StartDate) 
AND DATEADD(HOUR,-@TimezoneOffset,@EndDate)
...

并使用以下语句执行它:

exec sp_executesql @sql_TotalDialsNewLeads, 
N'@StartDate datetime, @EndDate datetime',
@StartDate,@EndDate;

这是MSDN guide。您也可以对 SQL 语句中的其他参数执行此操作。

【讨论】:

    【解决方案2】:

    不要在外部使用转换,而是在动态查询中使用它。

    类似的东西。 (未测试)

    DECLARE @sql_TotalDialsNewLeads nvarchar(1000) = N'
     SELECT COUNT(*)
       FROM ' + @tbl_CH + ' ch, ' + @tbl_CL + ' cl, ' + @tbl_DA + ' da
      WHERE ch.IDENTITY = cl.IDENTITY
        AND cl.CRMID = da.CRMID
        AND CallPlacedTime BETWEEN CONVERT(varchar(30),DATEADD(HOUR,'''+ -@TimezoneOffset +''','''+ @StartDate +'''),126)
                               AND CONVERT(varchar(30),DATEADD(HOUR,'''+ -@TimezoneOffset +''','''+ @EndDate +'''),126)
        AND Product = ''' + @Product + '''
        AND Country = ''' + @Country + '''
        AND DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,LoadedDateTime))
          = DATEPART(DayOfYear,DATEADD(HOUR,-@TimezoneOffset,CallPlacedTime))'
    
     EXECUTE(@sql_TotalDialsNewLeads);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多