如何在sql中读取xml datetime

时间:2011-09-13 12:12:42

标签: sql-server-2005 tsql

我有一个存储过程,它接收xml参数,现在xml包含日期和时间字段

以下是我的xml示例,它作为参数传递给存储过程。我正在使用SQL Server 2005

 <transdetails>
  <_x005B_Sheet1_x0024__x005D_>
    <Date_of_transaction>2011-07-29T13:47:34+05:00</Date_of_transaction>
    <Type_of_the_transaction>card</Type_of_the_transaction>
    <Card_number>7000460000451470</Card_number>
    <Total_quantity>27.81</Total_quantity>
    <Total_amount>2419.75</Total_amount>
    <Name_of_Retail_Outlet>MIDWAY PETROLEUM SERVICES</Name_of_Retail_Outlet>
    <Product_Purchased>PETROL</Product_Purchased>
  </_x005B_Sheet1_x0024__x005D_>
<transdetails>

这是存储过程

ALTER PROCEDURE [dbo].[usp_getexceldata]
    @transdetails xml 
AS
    SET NOCOUNT ON
    SET ARITHABORT ON
BEGIN
    DECLARE @XML AS XML

    DECLARE @DestinationTemp TABLE (ID INT IDENTITY(1,1),
                                    Date_of_transaction VARCHAR,
                                    Type_of_the_transaction nvarchar(255),
                                    Card_number nvarchar(255),
                                    Total_quantity float,
                                    Total_amount float, 
                                    Name_of_Retail_Outlet nvarchar(255),
                                    Product_Purchased nvarchar(255)
                                   )

    SET @XML = @transdetails

    INSERT INTO @DestinationTemp(Date_of_transaction, Type_of_the_transaction, Card_number, Total_quantity, Total_amount, Name_of_Retail_Outlet, Product_Purchased)
        SELECT
            x.d.query('./Date_of_transaction').value('.' , 'DateTime')  Date_of_transaction,
            x.d.query('./Type_of_the_transaction').value('.', 'nvarchar(255)') Type_of_the_transaction,
            x.d.query('./Card_number').value('.', 'nvarchar(255)')  Card_number,
            x.d.query('./Total_quantity').value('.' ,'float')  Total_quantity,
            x.d.query('./Total_amount').value('.' , 'float')  Total_amount,
            x.d.query('./Name_of_Retail_Outlet').value('.' ,'nvarchar(255)')  Name_of_Retail_Outlet,
            x.d.query('./Product_Purchased').value('.', 'nvarchar(255)')  Product_Purchased
        FROM
            @XML.nodes('transdetails//_x005B_Sheet1_x0024__x005D_')  x(d)

    SELECT * FROM @DestinationTemp

现在我在尝试将Date_of_transaction转换为datetime时遇到错误,如果我尝试将该值初始设置为varchar然后返回整数值,例如,如果我有日期

2011-07-29T13:47:34+05:00 

它会让我2 ...请帮忙吗?

2 个答案:

答案 0 :(得分:3)

您插入定义为Date_of_transaction VARCHAR的列,因此没有指定比例,因此它会截断为1个字符,因此2

答案 1 :(得分:2)

SQL Server 2005不处理日期时间值的时区部分。

您可以选择使用substring获取没有时区的日期时间。

x.d.query('./Date_of_transaction').value('substring(., 1, 19)' , 'DateTime')

样本中的结果值为2011-07-29 13:47:34.000

在SQL Server 2008中,您的查询可以正常工作返回的值将是2011-07-29 08:47:34.000,因为它使用时区值。

顺便说一句:您应该在Date_of_transaction中将DateTime的数据类型更改为@DestinationTemp