【发布时间】: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 >= DATEADD(DAY,1,EOMONTH(2016-03-23,-1)) AND EndOfMonth <= EOMONTH(2019-01-31)。在动态语句中使用参数。
标签: sql sql-server date