2016-09-03 10 views
0

終了日を超えてデータを返すVBAクエリを実行しています。次のようにVBAクエリが終了日を超えてデータを返します

コードは次のとおり

startdate = Format(Sheets("sheet1").Range("B2").Value, "####") 
enddate = Format(Sheets("sheet1").Range("B3").Value, "####") 

Set conn = New ADODB.connection 
Set rs = New ADODB.Recordset 
connection = "provider = sqloledb ; data source = &user; initial catalog = &data ; integrated security = sspi ; " 
conn.Open connection 
Set rs = conn.Execute("select * from sale_table where datetime >= " & startdate & " and datetime <= " & enddate & "") 

If Not rs.EOF Then 
    Sheets(1).Range("I12").CopyFromRecordset rs 
Else 
    MsgBox ("no record") 
End If 

あなたの日付フォーマットである2016年2月9日(終了日を越えて二日)点で最大示すENDDATE = 31/08/2016

結果

答えて

0

場合問題:

startdate = Format(Sheets("sheet1").Range("B2").Value, "####") 
enddate = Format(Sheets("sheet1").Range("B3").Value, "####") 

これら3について日付雑誌、または1月1日からの経過日数、1900年が生成されます1/8/2016(米国の場合は2011年8月31日)、Excelを使用する場合、enddateは42613になります。

SQLサーバーでは、DATEADD(DAY, ..., ...)またはCAST(... AS DATETIME)を使用してこれを日付に変換できます。暗黙的に、日付シリアル(<= enddateまたは>= startdate)に対して論理操作を実行すると、そのシリアルはdatetimeに変換されます。

ただし、SQL ServerでDATEADDまたはCASTを42613で試した場合、返されるデータが終了日を超えている理由が02/09/2016(米国:09/02/2016)になります。また、DATEDIFF(DAY, '2016-08-31', '1900-01-01')を試した場合、SQL Serverに42611が返されます。 2月31日の日付のシリアルのExcelの解釈との2日間の違い。

これはなぜですか?

氏チップピアソンはDates and Times in Excelで説明しますが、要約します。私がの日付シリアルと言うとき、01/01/1900から日が経過したことを意味することに注意してください。 ExcelとSQL Serverの両方で、デフォルトの日付値は01/01/1900です。ありませんしかし、:1900-JAN-0

00/01/1900(01/00/1900米国)以来の日数を表す数値として

Excelの保存日時有効な日付。つまり、Excelの日付シリアルを-1だけオフセットする必要があります。なぜそうなのか?

数字1は1900-Jan-1を表します。数字0は1899年12月31日ではないことに注意してください。実際には、この数値は実際の日数よりも1つ大きい数値です。これは、1900年2月29日の日付が存在するかのようにExcelが動作するためです。それはしませんでした。 1900年はうるう年ではありませんでした(2000年はうるう年です)。 Excelでは、1900年2月28日の翌日が1900年2月29日です。実際には、1900年2月28日以降の日は1900年3月1日でした。これは「バグ」ではありません。確かに、それは設計によるものです。

したがって、特定のケースでは、日付シリアル1はExcelで01/01/1900(日付シリアル0は00/01/1900なので)の最初の2日と閏年2000あなたの2番目の余分な日である365日ではなく、366日を要します。そのため、2020年2月9日までのデータが返されます。

要するに、Excelの日付表現は、01/01/1900からではなく、00/01/1900から、SQL Server文でExcel日付シリアルを使用する場合の閏年を考慮する必要があります。

+0

ありがとうございました@問題の説明については、@Jonathonをご覧ください。私はプログラミングに慣れていない、私は私のクエリを動作させることができません。範囲( "B2")。値 "yyyy-mm-dd") – speedyraz

+0

日付の値の両側に単一引用符を含める必要があります。それはあなたのSQLデータベースによって解釈されます。だから 'datetime> = '"&startdate& "'とdatetime <= '"&enddate& "'" ' –

+0

それは働いています......ありがとうございます。 – speedyraz

関連する問題