在存储过程中查询 xml 格式的日期

本文关键字:格式 日期 xml 查询 存储 存储过程 过程中 | 更新日期: 2023-09-27 18:36:14

我有一个存储过程

ALTER PROCEDURE [dbo].[CallHistoryBasedOnPersonInfoPerEvent]
(
 @LastName varchar(50)
,@FirstName varchar(50)
,@Gender varchar(20)
,@StartDate varchar(20)
,@EndDate varchar(20) = null
)
AS
BEGIN 
SELECT     
    *
FROM         
        CallerInformation 
    INNER JOIN
        ActivityLog ON CallerInformation.CallerID = ActivityLog.CallerID 
    LEFT OUTER JOIN
        CaseStatus ON CallerInformation.CaseStatusID = CaseStatus.CaseStatusID
WHERE     
        (ActivityLog.ActivityID = 1) 
    AND
        ActivityLog.SearchParameter.value('(/Root/PersonSearch/LastName)[1]','varchar(50)') = @LastName
    AND
        ActivityLog.SearchParameter.value('(/Root/PersonSearch/FirstName)[1]','varchar(50)') = @FirstName
    AND
        ActivityLog.SearchParameter.value('(/Root/PersonSearch/Gender)[1]','varchar(20)') = @Gender
    AND
        ActivityLog.SearchParameter.value('(/Root/PersonSearch/StartDate)[1]','varchar(20)') = @StartDate
    AND
        ActivityLog.SearchParameter.value('(/Root/PersonSearch/EndDate)[1]','varchar(50)') = @EndDate
END 

在表 ActivityLog 中,SearchParameterxml列。xml 以这种格式存储在那里

<Root>
    <PersonSearch>
        <CallerID>1249</CallerID>
        <StartDate>2013-01-16T00:00:00</StartDate>
        <LastName>b</LastName>
        <FirstName>t</FirstName>
        <Gender>Male</Gender>
        <DOBDay>0</DOBDay>
        <DOBMonth>0</DOBMonth>
        <AgeRangeStart>33</AgeRangeStart>
        <AgeRangeEnd>44</AgeRangeEnd>
        <Country>United States</Country>
        <UserName>nojha</UserName>
    </PersonSearch>
</Root>

根据我存储的程序中的连接,我必须在ActivityLog中选择记录。FirstNameLastNameGenderStartdateEnddate在XMl中。

现在我只面临日期问题。当我提供日期时,我在执行存储过程时没有收到任何记录。

我通过代码发送的startDate采用这种格式1/16/2013 12:00:00 AM .

我知道有些不匹配。我尝试了几件事。我删除了 XML 中的时间,并将参数@startdate转换为日期。它没有用。然后我将@startdate日期更改为varchar(20).它没有用。

我哪里出错了

在存储过程中查询 xml 格式的日期

如果你做得正确,它工作得很好 - 见这里:

-- define a table variable for demo purposes
DECLARE @table TABLE (ID INT, XMLDATA XML)
-- insert three rows with different <StartDate> values
INSERT INTO @table 
VALUES
   (1, '<Root><PersonSearch><StartDate>2013-01-16T00:00:00</StartDate></PersonSearch></Root>'),
   (2, '<Root><PersonSearch><StartDate>2013-01-18T00:00:00</StartDate></PersonSearch></Root>'),
   (3, '<Root><PersonSearch><StartDate>2013-01-16T00:00:00</StartDate></PersonSearch></Root>')
-- declare a search value, e.g. like the parameter of the stored procedure    
DECLARE @SearchDate DATE = '20130116'
-- select the rows from the table 
SELECT 
    ID
FROM
    @table
WHERE   
    XmlData.value('(/Root/PersonSearch/StartDate)[1]','date') = @SearchDate

我选择了 #1 和 #3 ID - 正如预期的那样。

因此,如果您真的使用DATE作为日期,那么它就可以工作