【问题标题】:How to read xml datetime in sql如何在sql中读取xml日期时间
【发布时间】:2016-10-10 00:15:01
【问题描述】:

我有一个存储过程正在接收 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...请帮助?

【问题讨论】:

    标签: sql-server-2005 tsql


    【解决方案1】:

    您插入到定义为Date_of_transaction VARCHAR 的列中,因此它将截断为1 个字符,因为没有指定比例,因此<b>2</b>

    【讨论】:

      【解决方案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,而不是因为它使用时区值。

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多