3

私の質問は、

DateTimeSQL テーブルにタイプの列があり、次のような値が含まれています

2013-02-01 10:00:00.000
2013-01-27 16:00:00.000
2013-02-01 14:00:00.000

Where次のように節で日付のみを言及した場合、クエリで結果を取得するにはどうすればよいですか。

SELECT *
FROM   tablename
WHERE  columnName = '2013-02-01'

このクエリを実行した後、この結果が必要です

2013-02-01 10:00:00.000
2013-02-01 14:00:00.000

親切にこれで私を助けてください。

4

3 に答える 3

5

列に関数を適用すると、クエリがサージ不可になり、 Cardinality Estimationが台無しになります。

代わりに間隔を使用してください。

select *
from tablename
where columnName >= '20130201' and
      columnName < '20130202'

注:日付形式YYYY-MM-DDは、SQL Server で考えるように常に解釈されるとは限りません

日付解釈のあいまいさを避けるために、普遍的な日付形式リテラル「YYYYMMDD」を使用してください。

set language German
go
select convert(datetime, '1989-06-12'),
       convert(datetime, '19890612'),
       convert(datetime2, '1989-06-12'),
       convert(datetime2, '19890612'),
       convert(date, '1989-06-12'),
       convert(date, '19890612')
于 2013-02-03T09:43:32.197 に答える
1

データは時間とともに保存されるため、Cast日付だけにする必要があります。

これを試して:

SELECT  * 
FROM tablename 
WHERE CAST(columnName as DATE) = '2013-02-01'

SQL Server のバージョンに応じて (DATE データ型をサポートしていない場合)、次を使用できます。

SELECT  * 
FROM tablename 
WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, columnName)) = DATEADD(dd, 0, DATEDIFF(dd, 0, '2013-02-01'))

編集 - 他の人が正当に指摘したように、上記の例では、その列のテーブルのインデックス作成から得られたパフォーマンスが失われます。これは、単一の入力パラメーター (この場合は 2013-01-01) を指定して探しているものです。

SELECT *
FROM tablename
WHERE columnName >= CONVERT(datetime,'2013-01-01')
  AND columnName < DATEADD(dd, 1, CONVERT(datetime,'2013-01-01'))

幸運を。

于 2013-02-03T07:31:41.543 に答える
0
SELECT *
FROM   tablename 
WHERE  CONVERT(VARCHAR, columnname, 103) = '01/01/2013'
于 2013-02-03T08:02:36.820 に答える