1

日時フィールドを使用したクエリで問題が発生しています。

その理由は、datetime フィールドを -varchar(10),..,103- に変換するためです。そのため、datetime の代わりに 103 形式の日付フィールドを含む where 句を適用できますが、where 句を使用すると、結果が表示されないか、グループ化されません。日時フィールドが文字列に変換されたため、必要な方法です。

この例の簡単なクエリを次に示します。

select ddate,SUM(ntotal) as Income from Inc_orders    
where nbranch=2 
and convert(varchar(10),ddate,103)                                   
between '01/06/2010' and '31/06/2010'   
group by convert(varchar(10),ddate,103)  
order by ddfecha desc

ddate は日時フィールド
です ntotal は整数
です nbranch は外部キーです

次に、別の 103 の日付範囲から結果を取得します。

01/10/2009  4447.0000    
02/01/2010  26267.8000    
02/02/2010  20498.0000    
02/04/2010  22565.1000   
02/05/2010  20539.0000    
02/11/2010  33934.3000     
02/12/2009  33587.4000   

私がそれのように見えるふりをするのは:

01/06/2010  29327.7000       
02/06/2010  31170.4000     
03/06/2010  37737.7000     
04/06/2010  25109.6000     
06/06/2010  20819.7000     
10/06/2010  44703.9000     
14/06/2010  21755.1000     
15/06/2010  39369.3000    
05/06/2010  29552.2000    
07/06/2010  35305.9000    
08/06/2010  30628.6000    
..........     
31/06/2010  18677.6000 

datetimepicker calentad コンボ オブジェクトを適用するには、パラメーターがカレンダーのように見える必要があるため、ソリューションは datepart、month、または year 関数を使用していません。

4

4 に答える 4

3

CONVERT(VARCHAR, DateField, 103)非効率的であり、並べ替えの際DATETIMEにも問題が発生します。

使用している SQL-Server のバージョンに応じて、通常最適と見なされる 2 つのオプションがあります。SQL-Server 2008 以降では を使用CAST(DateField AS DATE)し、以前のバージョンでは を使用しますDATEADD(DAY, 0, DATEDIFF(DAY, 0, DateField))

次の行で Ddate を VARCHAR に変換しているためです。

convert(varchar(10),ddate,103) between '01/06/2010' and '31/06/2010' 

'01/06/2010' と '31/06/2010' の日付への暗黙的な変換を削除しています。これは、日付ではなく文字列を比較しているため、'02/01/2000' が '01/01/2012' より大きいことを意味します。Ddate から時刻を削除し、式を日付 (時刻) 形式のままにすると、'01/06/2010' と '31/06/2010' が暗黙的に日付に変換されます。

これを簡単に説明するために、次の簡単なクエリを実行できます。

SELECT  CASE WHEN '02/06/2000' BETWEEN '01/06/2012' AND '03/06/2012' THEN 1 ELSE 0 END [String Comparison],
        CASE WHEN CONVERT(DATETIME, '02/06/2000') BETWEEN '01/06/2012' AND '03/06/2012' THEN 1 ELSE 0 END [Date Comparison]

したがって、クエリは次のようになります。

SET DATEFORMAT DMY

SELECT  CAST(DDate AS DATE) Ddate,
        SUM(ntotal) as Income 
FROM    Inc_orders    
WHERE   nbranch=2 
AND     CAST(DDate AS DATE) BETWEEN '01/06/2010' AND '31/06/2010'   
GROUP BY CAST(DDate AS DATE)
ORDER BY DDate

または

SELECT  DATEADD(DAY, 0, DATEDIFF(DAY, 0, DDate)) Ddate,
        SUM(ntotal) as Income 
FROM    Inc_orders    
WHERE   nbranch=2 
AND     DATEADD(DAY, 0, DATEDIFF(DAY, 0, DDate)) BETWEEN '01/06/2010' AND '31/06/2010'   
GROUP BY DATEADD(DAY, 0, DATEDIFF(DAY, 0, DDate))
ORDER BY DDate

補遺

時間が含まれているかどうかわからないDdateので、上記を使用して時間を削除することは関係ないかもしれませんが、where 句の文字列の比較に関する部分は引き続き関係があります。さらに、日付を文字列形式でアプリケーションに提示する必要がある場合はほとんどありません。日付を日付として保持し、アプリケーション層内でフォーマットすることをお勧めします (これが何であれ)。

于 2012-06-21T22:14:06.413 に答える
0

CONVERT、GROUP BY、WHEREでは使用しないでください。フィールドのSELECTリストでconvertを使用します

更新: MicrosoftのDATECONSTANTS
の有効で推奨される形式を参照してください。言語/設定で問題が発生しないように、「DATEFORMAT依存:NO」および「多言語:YES」の任意の形式を選択してください

更新:
私が見たとき、私は同じクエリ@Blorgbeardを書いていました:nbranchだけでグループ化できず、選択リストにddateがあるため、機能しません。また、group byでのnbranchも意味がありません。有効な値は、2だけです。クエリ/ニーズを再定義する必要があります

おそらく、あなたのクエリは次のようになります。

select ddate,SUM(ntotal) as Income from Inc_orders    
where nbranch=2 
and ddate  between '20100601' and '20100631'   
group by ddate   
order by ddate
于 2012-06-21T21:31:22.030 に答える
0

日付を文字列に変換せず、日付のままにしておきます。

select ddate,SUM(ntotal) as Income from Inc_orders    
where nbranch=2 
and ddate between '2010-06-01' and '2010-06-31'
group by nbranch   
order by ddate

ddate特定の方法で表示したい場合は、選択リストで変換できます。

于 2012-06-21T21:32:51.760 に答える
0

ドキュメントの日付を次のように変換できます:

ISNULL(CONVERT(varchar(12),tranInwardHeader.DocumentDate,103),'') AS DocumentDate
于 2012-06-22T03:07:12.657 に答える