1

動的ピボットをフィードする動的SQLのこの行は、正しい日付を取得して期待される結果を返さないようです。クエリが実行され、結果は返されません。

and PA.DATE_RECEIVED BETWEEN 
'+ convert(varchar(10), @Startdate, 120) +' AND '+ convert(varchar(10), @Enddate, 120) +'

取得している値を確認してください...ストアドプロシージャのSQL。

select convert(varchar(10), @Startdate, 120) - 2013-02-02    
select convert(varchar(10), @Enddate, 120) - 2013-02-26

通常のSQLでクエリを外部で実行すると、機能しますか?何が問題ですか。

select COALESCE( PT.[description] , 'Grand Total') AS [Transaction Type], 
           Sum (AI.PRICE_INC_VAT) AS [AMOUNT (ú) CREDIT],
           P.[DESCRIPTION] AS [PRODUCT TYPE]    
From  [dbo].[T1] C     
join [dbo].[T2] S on S.[Customer_ID]=C.[Customer_ID]     
join [dbo].[T3] SO on SO.[SITE_ID]=S.[SITE_ID]    
join [dbo].[T4] OI on OI.[ORDER_ID]=SO.[SITE_ORDER_ID]    
left join [dbo].[T5] P on P.[PRODUCT_ID]=OI.[PRODUCT_ID]    
JOIN [dbo].[T6] AI ON  AI.ORDER_ITEM_ID = OI.ORDER_ITEM_ID    
JOIN T7 JBAI ON JBAI.ACTION_ITEM_ID = AI.ACTION_ITEM_ID    
JOIN T8 JB ON JB.JOB_BATCH_ID = JBAI.JOB_BATCH_ID    
JOIN T9 PA on PA.PAYMENT_ID=JB.PAYMENT_ID    
LEFT JOIN T10 CU ON JB.CUSTOMER_USER_ID = CU.CUSTOMER_USER_ID    
JOIN T11 PT ON PT.PAYMENT_TYPE_ID=PA.PAYMENT_TYPE_ID     
LEFT JOIN T12 SU ON SU.SYS_USER_ID=JB.SYS_USER_ID   
where P.[PRODUCT_CATEGORY_ID]= ( 
                        select PC.[PRODUCT_CATEGORY_ID] from [dbo].[PRODUCT_CATEGORY] PC 
                        where PC.[DESCRIPTION]='BAGS')     
and C.COMPANY_ID= '12'    
and PA.DATE_RECEIVED BETWEEN '02-FEB-2013' AND '26-FEB-2013'    
group by PT.DESCRIPTION, P.DESCRIPTION 
4

4 に答える 4

2

PA.DATE_RECEIVED BETWEEN 2013-02-02 AND 2013-02-26文字列を読み取ろうとする代わりに、日付の前後に一重引用符がない可能性がありますPA.DATE_RECEIVED BETWEEN '2013-02-02' AND '2013-02-26'。文字列で一重引用符を取得する方法の例を次に示します。

DECLARE @var VARCHAR(1000) = 
    'and PA.DATE_RECEIVED BETWEEN ''' + 
    convert(varchar(10), GETDATE(), 120) +
    ''' AND ''' + 
    convert(varchar(10), GETDATE(), 120) + ''''

SELECT @var

リテラル文字列の単一引用符は。で示され''ます。

于 2013-02-26T10:06:54.330 に答える
1

見積もりの​​問題が発生したと思います。動的クエリに一重引用符を表示するには、エスケープされた引用符に注意してください

およびPA.DATE_RECEIVEDBETWEEN'''+convert(varchar(10)、@Startdate、120)+''' AND'''+ convert(varchar(10)、@Enddate、120)+'''

于 2013-02-26T10:08:44.577 に答える
0

これを試しましたか:

and PA.DATE_RECEIVED BETWEEN @Startdate AND @Enddate

BETWEENステートメントを機能させるために日付を変換する必要はありません

于 2013-02-26T10:04:20.780 に答える
0

クエリにはいくつかの問題があると思います。(1)SQL文字列を作成する、(2)日付をvarchar値と比較しようとする、(3)文字列を日付に変換する

たとえば、次のようになります。

declare @sql nvarchar(max), 
        @startdate varchar(50) = '20130202', --Using ISO format (yyyymmdd)
        @enddate varchar(50) = '20130226' --Using ISO format 

select @sql = 'SELECT col1, col2, ... FROM myTable WHERE mydate '+
               'between convert(date, ' + @startdate + ') and ' +
               'convert(date, ' + @enddate + ')' 
于 2013-02-26T10:17:25.807 に答える