私はstart_date
とend_date
を持っています。この2つの日付の間にある日付のリストを取得したいです。誰かが私が私の質問で間違いを指摘するのを手伝ってくれる?.
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and Date between 2011/02/25 and 2011/02/27
ここでDate
はdatetime
変数です。
このような2つの日付を単一引用符で囲む必要があります。
select Date, TotalAllowance from Calculation where EmployeeId = 1
and Date between '2011/02/25' and '2011/02/27'
または使用できます
select Date, TotalAllowance from Calculation where EmployeeId = 1
and Date >= '2011/02/25' and Date <= '2011/02/27'
指定した時間セグメントのないdatetimeはdate 00:00:00.000
の値を持つので、範囲内のすべての日付を確実に取得したい場合は、終了日の時刻を指定するか、終了日を増やして<
を使用する必要があります。
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date between '2011/02/25' and '2011/02/27 23:59:59.999'
OR
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date < '2011/02/28'
OR
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date <= '2011/02/27 23:59:59.999'
その時間が00:00:00.000の場合、2011/02/28からいくつかのレコードが返される可能性があるため、以下を使用しないでください。
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date between '2011/02/25' and '2011/02/28'
これを試して:
select Date,TotalAllowance from Calculation where EmployeeId=1
and [Date] between '2011/02/25' and '2011/02/27'
日付値は文字列として入力する必要があります。
SQL Server 2008以降でのクエリの将来性を保証するために、Date
はエスケープする必要があります。これは、それ以降のバージョンでは予約済みのWordです。
時間のない日付はデフォルトとして真夜中を取るので、あなたはそこに正しい値を持っていないかもしれないことに注意してください。
select * from table_name where col_Date between '2011/02/25'
AND DATEADD(s,-1,DATEADD(d,1,'2011/02/27'))
ここでは、最初に現在のendDateに日を追加します、それは2011-02-28 00:00:00
になります、そしてあなたは終了日を2011-02-27 23:59:59
にするために1秒引きます。こうすることで、与えられた間隔の間のすべての日付を取得できます。
output:
2011/02/25
2011/02/26
2011/02/27
このクエリは、現在の日付とその次の3つの日付の間の値を取得するのに適しています。
SELECT * FROM tableName WHERE columName
BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
これにより、最終的に現在の日付にさらに3日間のバッファが追加されます。
select * from test
where CAST(AddTime as datetime) between '2013/4/4' and '2014/4/4'
- データ型が異なる場合
これは非常に古いですが、私がこれまでに経験したことのある多くの経験を考慮すると、これを考慮してください。たとえば、地域によっては異なる地域設定を使用する人もいます。さらに、MySQLデータベースに提供されている16/11/12は、2016年11月12日に内部的に変換されます。一方、英国の地域設定コンピュータで実行されているAccessデータベースは、次のように解釈します。 2012年11月16日として保存してください。
そのため、日付やデータベースと対話するときはいつでも、明示的にすることをポリシーにしました。それで、私はいつも私の質問とプログラミングコードを以下のように供給します:
SELECT FirstName FROM Students WHERE DoB >= '11 Dec 2016';
Accessが#を受け入れることにも注意してください。
SELECT FirstName FROM Students WHERE DoB >= #11 Dec 2016#;
しかし、MS SQLサーバはそうではないでしょう、それで私はいつも "'"を上のように使います、両方のデータベースはそれを受け入れます。
そして、コード内の変数からその日付を取得するとき、私はいつも以下のように結果を文字列に変換します。
"SELECT FirstName FROM Students WHERE DoB >= " & myDate.ToString("d MMM yyyy")
私はこれを書いています。私は時々、何人かのプログラマーが固有の変換を検出するのに十分に熱心でないかもしれないのを知っているので。 13未満の日付でもエラーは発生しません。異なる結果になります。
質問については、最終日に1日を加えて、次のように比較します。
dated >= '11 Nov 2016' AND dated < '15 Nov 2016'
例えば##の間に日付を入れてみてください。
#2013/4/4# and #2013/4/20#
それは私のために働きました。
---編集---誰かがこの回答に賛成票を投じたため、2つの評判ポイントを失ったという通知を受け取りました。答えがあなたのためにうまくいかない場合は、単に投票しないでください。コメントでさらなる情報/助けを求めるか、または他の解決策をチェックしてください。
私は評判ポイントを気にしません - 私はただ賛成票はそのために作られていないと言います。
select Date,TotalAllowance
from Calculation
where EmployeeId=1
and convert(varchar(10),Date,111) between '2011/02/25' and '2011/02/27'
現在の日付と 過去3日間の間の選択された日付を検索するのに最適なクエリ :
select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN
DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND CURDATE()
現在の日付と 次の3日間の間の選択された日付に対する最良の照会 :
select Date,TotalAllowance from Calculation where EmployeeId=1 and Date BETWEEN
CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 3 DAY)
その日付が24時間で朝から始まり夜に終わる場合は、次のように追加します。
declare @Approval_date datetime
set @Approval_date =getdate()
Approval_date between @Approval_date +' 00:00:00.000' and @Approval_date +' 23:59:59.999'
Select
*
from
Calculation
where
EmployeeId=1 and Date between #2011/02/25# and #2011/02/27#;
2つの日付データを表示するためにbetweenを使用できますが、これはデータ全体を検索して比較するため、巨大なデータでは処理が遅くなりますので、すべてのユーザーがdatediff
を使用することをお勧めします。
qry = "SELECT * FROM [calender] WHERE datediff(day,'" & dt & "',[date])>=0 and datediff(day,'" & dt2 & "',[date])<=0 "
ここで、カレンダーはテーブルで、開始日変数としてdt、終了日変数としてdt2です。
下記の例をチェックしてください。
select * from tblUser Where
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**
OR
select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**
OR
select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30'))
//--**Working**
そして、以下は動作していません:
select * from tblUser Where
Convert(Varchar(10),CreatedDate,111) >= Convert(Varchar(10),'01-01-2015',111) and Convert(Varchar(10),CreatedDate,111) <= Convert(Varchar(10),'31-12-2015',111) //--**Not Working**
select * from tblUser Where
(Convert(Varchar(10),CreatedDate,111) between Convert(Varchar(10),'01-01-2015',111) And Convert(Varchar(10),'31-12-2015',111)) //--**Not Working**
実際、最も正確な結果を得るには、すべてのsql日付をyyyy-MM-dd形式にする必要があります。
あなたはこのSQLを試すことができます
select * from employee where rec_date between '2017-09-01' and '2017-09-11'
私は行きます
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date < DATEADD(d, 1, '2011/02/27')
>=
は開始日全体を含み、<
は終了日を除外するという論理なので、終了日に1単位を追加します。これは数ヶ月間適応することができます、例えば:
select Date, ... from ...
where Date >= $start_month_day_1 and Date < DATEADD(m, 1, $end_month_day_1)
私は日付のために構文 '1 MonthName 2015'を使うのが好きです:
WHERE aa.AuditDate>='1 September 2015'
AND aa.AuditDate<='30 September 2015'
日付について