【问题标题】:Add Where clause to only select records within certain date range添加 Where 子句以仅选择特定日期范围内的记录
【发布时间】:2014-06-17 08:52:28
【问题描述】:

我有一个表格,其中有一列“dateRec”格式化为日期时间,还有一个 Select 过程从该表格中获取数据。 该过程有两个输入参数,rangeStart 和rangeEnd,它们可以格式化为 datetime 或 nvarchar(这里有什么意义)。

如何实现只选择 dateRec 介于 rangeStart 和 rangeEnd 之间的记录?

我的程序(缩短) - 只是为了展示我在寻找什么:

ALTER PROCEDURE [dbo].[FetchRequests]
    @rangeStart datetime,
    @rangeEnd datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      logID,
                flag,
                reviewer,
                dateRec
    FROM        LogRequests
    WHERE       dateRec >= rangeStart
    AND         dateRec <= rangeEnd
    FOR XML PATH('requests'), ELEMENTS, TYPE, ROOT('ranks')
END

非常感谢您提供的任何帮助,迈克。

【问题讨论】:

  • 这有什么问题?
  • 正如@Nithesh 所说,这是否有错误,或者这只是代码审查?
  • 因为参数是datetime,如果您传递一个 NVARCHAR,它将在过程开始之前被结合到一个日期时间中。那么,基本上,您现有的代码有什么问题?
  • @Mike 你没有正确使用变量,你需要添加一个@符号。请看下面我的回答。
  • 谢谢 - 所以这实际上是正确的?我没想到我可以那样选择日期。

标签: sql sql-server date datetime stored-procedures


【解决方案1】:

您可以使用关键字 BETWEEN:

ALTER PROCEDURE [dbo].[FetchRequests]
    @rangeStart datetime,
    @rangeEnd datetime
AS
BEGIN
    SET NOCOUNT ON;

    SELECT      logID,
                flag,
                reviewer,
                dateRec
    FROM        LogRequests
    WHERE       dateRec BETWEEN @rangeStart AND @rangeEnd
    FOR XML PATH('requests'), ELEMENTS, TYPE, ROOT('ranks')
END

【讨论】:

  • 谢谢!这将包括 rangeStart 日期和 rangeEnd 日期吗?另外,我需要什么格式传递这个过程的参数?像 2014-01-31 这样的东西会起作用还是输入必须是某种格式?
  • Yes BETWEEN 如果 test_expression 的值大于或等于 begin_expression 的值且小于或等于 end_expression 的值,则返回 TRUE。
  • 非常感谢 - 这太棒了!
  • 很高兴能帮上忙。
  • 使用函数 SELECT GETDATE() 确定为服务器配置的默认日期时间格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 2017-02-03
  • 1970-01-01
  • 2017-06-16
  • 2018-06-01
  • 2019-01-03
  • 1970-01-01
相关资源
最近更新 更多