回答:
次のように、これら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'
最初の日付は包括的ですが、2番目の日付は事実上「2011/02/27 00:00:00」であるため、排他的であることを覚えておいてください
between
、期待どおりに動作するはずです。
指定された時間セグメントのない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'
または
select Date,TotalAllowance from Calculation where EmployeeId=1
and Date >= '2011/02/25' and Date < '2011/02/28'
または
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'
'2011/02/28 00:00:00.000'
?
convert(date, Date) between '2011/02/25' and '2011/02/27'
(少なくとも最近のMS SQL Serverで)使用することもできます。convert()
パートタイムの一部を除去してくれますし、期待通りの比較の間に、次に動作します。
これを試して:
select Date,TotalAllowance from Calculation where EmployeeId=1
and [Date] between '2011/02/25' and '2011/02/27'
日付の値は文字列として入力する必要があります。
SQL Server 2008以降のクエリの将来性を保証するにDate
は、をエスケープする必要があります。これは、それ以降のバージョンでは予約語であるためです。
時間のない日付はデフォルトで午前0時をとるため、正しい値がない可能性があることに注意してください。
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
。次に、1秒を減算して終了日を作成します2011-02-27 23:59:59
。これを行うことにより、指定された間隔の間のすべての日付を取得できます。
output:
2011/02/25
2011/02/26
2011/02/27
これは非常に古いですが、日付に関する多くの経験があるので、これを検討することをお勧めします。人々はさまざまな地域設定を使用しているため、一部の人々(および地域設定によっては一部のデータベース/コンピューター)がこれを読む可能性があります日付2016年12月11日または2016年11月12日として2016年12月11日。さらに、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#
それは私のために働いた。
現在の日付から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)
以下の例を確認してください。
select * from tblUser Where
convert(varchar(10),CreatedDate,111) between '2015/04/01' and '2016/04/01' //--**Working**
または
select * from tblUser Where
(CAST(CreatedDate AS DATETIME) between CAST('2015/04/01' AS DATETIME) And CAST('2016/4/30'AS DATETIME)) //--**Working**
または
select * from tblUser Where
(YEAR(CreatedDate) between YEAR('2015/04/01') And YEAR('2016/4/30'))
//--**Working**
AND以下は機能しません:
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**
私は行きます
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)
最も正確な結果を得るには、実際にはすべてのSQL日付をyyyy-MM-dd形式にする必要があります。
/****** Script for SelectTopNRows command from SSMS ******/
SELECT TOP 10 [Id]
,[Id_parvandeh]
,[FirstName]
,[LastName]
,[RegDate]
,[Gilder]
,[Nationality]
,[Educ]
,[PhoneNumber]
,[DueInMashhad]
,[EzdevajDate]
,[MarriageStatus]
,[Gender]
,[Photo]
,[ModifiedOn]
,[CreatorIp]
From
[dbo].[Socials] where educ >= 3 or EzdevajDate >= '1992/03/31' and EzdevajDate <= '2019/03/09' and MarriageStatus = 1
次のように書く方が良いでしょう:
CREATE PROCEDURE dbo.Get_Data_By_Dates
(
@EmployeeId INT = 1,
@Start_Date DATE,
@End_Date Date
)
AS
Select * FROM Calculation
where EmployeeId=@EmployeeId AND Test_Date BETWEEN @Start_Date AND @End_Date
RETURN
SELECT Date, TotalAllowance
FROM Calculation
WHERE EmployeeId = 1
AND Date BETWEEN to_date('2011/02/25','yyyy-mm-dd')
AND to_date ('2011/02/27','yyyy-mm-dd');