1

私のテーブルは以下のようになります

tbPatientEpisode
EpisodeIDP    int
EpisodeNumber varcher
EpisodeDate   datetime

以下のSQLクエリで試してみると

SELECT * FROM tbPatientEpisode

下の画像のような結果が表示されます..

結果

このために2013-01-22のような特定の日付のデータが必要です。SQLクエリの下で試しました

SELECT * FROM tbPatientEpisode where EpisodeDate  like '%2013-01-22%'

ただし、行は返されません。私のクエリの何が問題なのか、この種の結果を得る適切な方法はありますか..どんな助けでも感謝します.

4

4 に答える 4

4

日付列に like を使用しないでください。機能しません。

代わりに (SQL Server 2008 以降):

SELECT * 
FROM tbPatientEpisode 
where CAST(EpisodeDate as Date) = '2013-01-22'

注: このフォームは、列で始まる適用可能なインデックスを使用しませんEpisodeDate

適用可能なインデックスが使用されていることを確認する場合 (および SQL Server 2005 で動作する場合):

SELECT * 
FROM tbPatientEpisode 
where EpisodeDate between = '2013-01-22 00:00:00' AND '2013-01-22 23:59:59.997'
于 2013-08-17T11:31:42.503 に答える
2

これは、列EpisodeDateが日時型であるためです。datetime にキャストEpisodeDateすることもできますが、列でインデックスを使用できなくなるため、私が知っている最善の方法はEpisodeDate、2 つの datetimeと比較することです。

SELECT *
FROM tbPatientEpisode
where
    EpisodeDate >= convert(datetime, '20130122', 112) and 
    EpisodeDate < dateadd(day, 1, convert(datetime, '20130122', 112))

少し説明します:

まず、変換せずに EpisodeDate を文字列と比較し、SQL Server の暗黙的な変換に依存することができますが、次の 2 つの点に注意する必要があります。

  • タイプの優先度。異なる型の valus を比較すると、優先度の低いデータが優先度の高い型に変換されます。varcharの優先度が よりも低いため、私たちの場合は良いのですdatetimeが、たとえば、列が でvarcharあり、それを と比較したい場合、インデックスの使用を妨げる可能性がありますdatetime
  • SQL サーバーが文字列を日付に変換する方法を知っておく必要があります。たとえば、SQL サーバーは YYYYMMDD の形式を簡単に認識できますが、一般的にはデータを明示的に変換することをお勧めします。

だからあなたの場合はあなたが使うことができます

select *
FROM tbPatientEpisode
where
    EpisodeDate >= '20130122' and 
    EpisodeDate < '20130123'

しかし、あなたは自分が何をしているのかを知っていることを確認する必要があります

20130122 を入力パラメーターとして考えているため、指定dateadd(day, 1, '20130122')していないので、クエリでこの文字列を置き換えることができます'20130123'

于 2013-08-17T11:32:31.967 に答える
0

この回答では、最初にソリューションが機能しない理由、(お勧めしません)EpisodeDate like '%2013-01-22%'を使用して目的の結果を得るために何ができるかを説明like ...し、最後に 2 つのソリューション (暗黙的な変換ありとなし) を説明します。すべてのクエリは、 AdventureWorks2008R2 サンプル データベースで実行できます。

/*
CREATE INDEX IX_SalesOrderHeader_OrderDate
ON Sales.SalesOrderHeader(OrderDate)
*/

-- It CONVERTs datetime values to VARCHAR with style 0 {Style 0 = mon dd yyyy hh:miAM (or PM)}
-- http://technet.microsoft.com/en-us/library/ms187928.aspx
SELECT  TOP(1500)
        h.OrderDate,h.SalesOrderID, 
        CONVERT(VARCHAR(40),h.OrderDate,0) AS OrderDateAsVarChar40, -- Explicit conversion from DATETIME to VARCHAR(40) with style 0
        LEFT(h.OrderDate,40) AS ForcingImplicitConvertOnDateTimeColumn -- Implicit conversion because the first argument of LEFT function must be a %CHAR
FROM    Sales.SalesOrderHeader h;
/*
OrderDate               SalesOrderID OrderDateAsVarChar40 ForcingImplicitConvertOnDateTimeColumn
----------------------- ------------ -------------------- --------------------------------------
2005-07-01 00:00:00.000 43659        Jul  1 2005 12:00AM  Jul  1 2005 12:00AM
...
2005-11-19 00:00:00.000 44685        Nov 19 2005 12:00AM  Nov 19 2005 12:00AM
2005-11-20 00:00:00.000 44686        Nov 20 2005 12:00AM  Nov 20 2005 12:00AM
...
2008-07-31 00:00:00.000 75123        Jul 31 2008 12:00AM  Jul 31 2008 12:00AM
*/

-- Result: No rows
SELECT  h.OrderDate,h.SalesOrderID
FROM    Sales.SalesOrderHeader h
-- The syntax of LIKE operator shows that h.OrderDate must be %CHAR
-- so, SQL Server add an implicit conversion of OrderDate values from DATETIME to VARCHAR
-- http://technet.microsoft.com/en-us/library/ms179859.aspx
WHERE   h.OrderDate LIKE '%2005-11-20%'

実行計画: ここに画像の説明を入力

-- Result: 5 rows 
-- I get 5 rows but it's the execution plan is unoptimized (because of Index Scan; see first execution plan)
SELECT  h.OrderDate,h.SalesOrderID
FROM    Sales.SalesOrderHeader h
WHERE   h.OrderDate LIKE 'Nov 20 2005%';

-- Result: 5 rows 
-- I get 5 rows and the execution plan includes 
-- (1) Index Seek operator instead of Index Scan
-- (2) and implicit conversion of @1 and @2 parameters from varchar to datetime
SELECT  h.OrderDate,h.SalesOrderID
FROM    Sales.SalesOrderHeader h
WHERE   h.OrderDate >= '20051120' AND h.OrderDate < '20051121';

実行計画: ここに画像の説明を入力

-- Result: 5 rows 
-- I get 5 rows and the execution plan includes 
-- (1) Index Seek operator instead of Index Scan
-- (2) and no implicit conversion of @1 and @2 parameters
-- See Date, Time, and Timestamp Literals: http://msdn.microsoft.com/en-us/library/windows/desktop/ms710282(v=vs.85).aspx
SELECT  h.OrderDate,h.SalesOrderID
FROM    Sales.SalesOrderHeader h
WHERE   h.OrderDate >= {d '2005-11-20'} AND h.OrderDate < {d '2005-11-21'};

実行計画: ここに画像の説明を入力

于 2013-08-17T15:25:15.153 に答える