【问题标题】:Find entries within date-interval in sp_execute sql statement in SQL在 SQL 中的 sp_execute sql 语句中查找日期间隔内的条目
【发布时间】:2019-11-07 19:45:32
【问题描述】:

我需要一些帮助来制作@query,我只能在预定义的时间间隔内获取日期条目。我的完整查询未在此处显示,因为查询的其余部分工作正常。我只想获取位于特定时间间隔内的数据条目。

我的时间间隔由每个月和年条目的 FirstOfMonth 和 EndOfMonth 构成,这意味着数据看起来像这样并且格式设置为日期:

我想选择在@DateStart@DateEnd 指定的预定义区间内的数据。由于查询还需要调用我选择使用此方法的列名。在我的旧查询中,我使用了显示的 WHERE 子句,因为我想捕获所有在所选 @DateStart 中的第一个月内和在所选 @DateEnd 中的最后一个月内的所有条目。

当我尝试将变量声明为datetime 时,我收到一个错误,说我不能在同一个@query 中同时使用NVARCHAR(MAX) 和(Datetime)。也理解正确吗?

BEGIN
DECLARE 
    ,@DateStart AS NVARCHAR(MAX)
    ,@DateEnd AS NVARCHAR(MAX)
--  , + 4 Multiple Dynamically Declared 

SET @DateStart = '2016-03-23'
SET @DateEnd ='2019-01-31'

set @query = 
    '
    SELECT 
        * -- 4 Dynamically Declared Variables Here
        ,StartOfMonth
        ,EndOfMonth
    FROM TestData
        WHERE StartOfMonth >= DATEADD(DAY,1,EOMONTH(' + @DateStart + ',-1))
        AND EndOfMonth <= EOMONTH(' + @DateEnd + ')
    '
EXEC sp_executesql @Query
END

【问题讨论】:

  • 为什么还要在这里使用动态sql呢?从您发布的内容来看,完全没有理由这样做。当然不要将日期变量设为 varchar。
  • 你为什么要注入日期而不是参数化它们?而且,您当然不需要 2GB 来存储日期和时间值。
  • 即使nvarchar(max) 你的WHERE 声明是错误的 - WHERE StartOfMonth &gt;= DATEADD(DAY,1,EOMONTH(2016-03-23,-1)) AND EndOfMonth &lt;= EOMONTH(2019-01-31)。在动态语句中使用参数。

标签: sql sql-server date


【解决方案1】:

我不明白你为什么使用动态 sql。您可以消除这种复杂性,只需运行参数化查询。像这样。

SELECT 
    * -- Multiple Declared Text Variables Here
    ,StartOfMonth
    ,EndOfMonth
FROM TestData
WHERE StartOfMonth >= DATEADD(DAY,1,EOMONTH(@DateStart,-1))
    AND EndOfMonth <= EOMONTH(@DateEnd)

或者,如果由于某种原因从您发布的内容中不清楚,您确实需要动态 sql,您应该对其进行参数化。最终会变成这样。

set @query = 
    N'
    SELECT 
        * -- Multiple Declared Text Variables Here
        ,StartOfMonth
        ,EndOfMonth
    FROM TestData
        WHERE StartOfMonth >= DATEADD(DAY,1,EOMONTH(@Date_Start,-1))
        AND EndOfMonth <= EOMONTH(@Date_End)
    '
EXEC sp_executesql @Query, N'@Date_Start date, @Date_End date', @Date_Start = @DateStart, @Date_End = @DateEnd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多