0

From Date と To Date の 2 つの変数を設定しようとすると問題が発生します。1 つの問題を解決すると、もう 1 つの問題も簡単に解決できます。エラーが発生します:

nvarchar 値 '06/30/2012' をデータ型 int に変換するときに変換に失敗しました。

ビューを使用してさまざまなテーブルをまとめてから、必要なテーブルを を介して実行していることは注目に値しsp_executesqlます。クエリを印刷すると、 が 0 として認識されていることがわかります@fromdate。おそらくそれが問題です..

 declare @fromdate nvarchar
 declare @todate nvarchar
 select @fromdate = '03/01/1999'
 select @todate = ''

 IF @fromdate <> ''
BEGIN
    SELECT @sql = @sql + ' and convert (nvarchar,document_Date,101) > '+@fromdate+''
END

 if @todate <> ''
BEGIN
    SELECT @sql = @sql + ' and convert(nvarchar,document_date,101) >  '+@todate+''
END

document_dateは日時です。何か案は?もしそうなら、なぜこれが起こっているのかを説明していただけますか? 以下に印刷SQLを含めました。

 SELECT  [system_status]      
  ,[document_status_code]      
  ,[rpt_category]      
  ,[category]      
  ,[user_status_cd]      
  ,[user_status]      
  ,[assigned_to_id]      
  ,[assigned]      
  ,[assigned_to_date]      
  ,[owner_id]      
  ,[owner]      
  ,[rpt_acct_code]      
  ,[acct_name]      
  ,[rpt_title]      
  ,[job_name]      
  ,[logged_time]      
  ,[rpt_format_type]      
  ,[rpt_run_id]      
  ,[rpt_doc_id]      
  ,[rpt_id]      
  ,[rpt_filename]      
  ,[rpt_file_path]      
  ,[rpt_run_name]      
  ,[sla_start_date]      
  ,[sla_due_date]      
  ,[sla_completed_date]      
  ,[sla_status]      
  ,[SLA_Days]
  ,[Document_Date] 
  FROM VW_Document_Main
  WHERE 1=1 and convert (nvarchar,document_Date,101) > 0 
  order by document_status_code  ,owner_id 
4

4 に答える 4

1

問題の一部は、宣言に長さが含まれていないことです@fromdate

長さがないため、最初の文字のみが返されます。宣言には次のように記載する必要があります。

declare @fromdate nvarchar(10)
declare @todate nvarchar(10)

長さがないので0、最初の文字が返されます。

次に、日付の文字列値も比較しています。日付値を比較する必要があります。

declare @fromdate datetime
declare @todate datetime

次に、コードは次のようになります。

SELECT @sql = @sql + ' and document_Date > '''+convert(varchar(10), @fromdate, 101)+''''
于 2013-03-28T16:05:46.587 に答える
0

リテラル

'03/01/1999'

文字列リテラルです。varchar に変換document_Dateしてから、不等式比較を行っています

and convert (nvarchar,document_Date,101) > '+@fromdate

日付は YYYYMMDD でフォーマットされていないため、比較によって期待どおりの結果が得られる可能性は低いです。

@fromdateたとえば、'04/01/1900' の場合、'04 ' は '03' より大きいため、'03/01/1999' より大きくなります

代わりに、@fromdate を document_Date と同じ型に変換します。

AND document_Date > convert(datetime, @fromdate)
于 2013-03-28T16:02:30.937 に答える
0

列 document_date が既に日時である場合、declare @fromdate および @todate も日時として宣言しないのはなぜですか。そうすれば、コードがより単純になり、変換を行う必要がなくなります。あなたがやろうとしていることには、変換は不要のようです。

于 2013-03-28T16:05:37.393 に答える
0

問題#1

declare @fromdate nvarchar
select @fromdate = '03/01/1999'

長さのない文字列を気にしないで、これらをUnicode文字列として定義するのはなぜですか? リテラルにあいまいで信頼性の低い形式を使用しているのはなぜですか? それは 3 月 1 日ですか、それとも 1 月 3 日ですか。SQL Server のインスタンスがあなたと一致していると確信していますか?

問題#2

SELECT @sql = @sql + ' and convert (nvarchar,document_Date,101) > '+@fromdate+''

長さのない文字列を気にしないで、なぜ列をUnicode文字列に変換するのですか? なぜ文字列として比較するのですか?文字列として比較すると 'よりも大きいことがわかりますよね?'05/05/2010''02/21/2015

解決

あいまいな形式の使用を停止します。日付は文字列であり、そのように比較する必要があると考えるのはやめましょう。

どうですか:

DECLARE @fromdate DATETIME = '19990301'; -- guessing you meant March 1st. 
      -- See why ambiguous formats are bad and you should never use them?

...
SELECT @sql += ' AND document_Date > @fromdate;';

EXEC sp_executesql @sql, N'@fromdate DATETIME', @fromdate;

これで、変換を行う必要はまったくありません。

于 2013-03-28T16:07:49.350 に答える