50

SQL Server にDATETIMEは、時間要素を含む列があります。

例:

'14 AUG 2008 14:23:019'

時間の部分を無視して、特定の日のレコードのみを選択する最良の方法は何ですか?

例: (時間の部分と一致せず、行を返さないため、安全ではありません)

DECLARE  @p_date DATETIME
SET      @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT *
FROM   table1
WHERE  column_datetime = @p_date

注: このサイトは、拾って忘れたメモやテクニックを書き留めることも目的としているため、MSSQL の DATETIME に関する内容はおそらく SQLBOL で最も検索するトピックであるため、この質問に対する私自身の回答を投稿します。


明確化された例を更新して、より具体的にします。


編集申し訳ありませんが、間違った回答 (間違った結果を返す回答) を修正する必要がありました。

@Jorrit: WHERE (date>'20080813' AND date<'20080815')13 番目と 14 番目を返します。

@wearejimbo:閉じますが、葉巻はありません! あなたに授与されるバッジ。2008 年 8 月 14 日 23:59:001 から 23:59:999 に書き込まれたレコードを見逃しました (つまり、真夜中の 1 秒前)。

4

18 に答える 18

38

テクニック 1:

 DECLARE @p_date DATETIME
 SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

 SELECT  *
 FROM    table1
 WHERE   column_datetime >= @p_date
 AND     column_datetime < DATEADD(d, 1, @p_date)

これの利点は、「column_datetime」の任意のインデックスが存在する場合に使用されることです。

于 2008-08-14T09:16:03.530 に答える
20

SQL Server 2008 では、新しい DATE データ型を使用できました

DECLARE @pDate DATE='2008-08-14'  

SELECT colA, colB
FROM table1
WHERE convert(date, colDateTime) = @pDate  

@男。このソリューションは問題なく拡張できることがわかると思います。元のクエリのクエリ実行プランを見てください。

そして私の場合:

于 2008-08-14T09:42:14.537 に答える
8

年、月、日の値を比較するだけです。

Declare @DateToSearch DateTime
Set @DateToSearch = '14 AUG 2008'

SELECT * 
FROM table1
WHERE Year(column_datetime) = Year(@DateToSearch)
      AND Month(column_datetime) = Month(@DateToSearch)
      AND Day(column_datetime) = Day(@DateToSearch)
于 2008-08-14T09:19:55.190 に答える
4

テクニック 2:

DECLARE @p_date DATETIME
SET     @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 )

SELECT  *
FROM    table1
WHERE   DATEDIFF( d, column_datetime, @p_date ) = 0

column_datetime フィールドがインデックス化されておらず、インデックス化される可能性が低い (またはインデックスが使用される可能性が低い) 場合は、DATEDIFF() を使用する方が短くなります。

于 2008-08-14T09:19:16.067 に答える
4

このようなもの?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'
于 2008-08-14T09:23:23.390 に答える
4

私は通常、次のように日時を日付に変換して比較します。

SELECT 'Same Date' WHERE CAST(getDate() as date) = cast('2/24/2012 2:23 PM' as date)

また

SELECT 'Same Date' WHERE DATEDIFF(dd, cast(getDate() as date), cast('2/24/2012 2:23 PM' as date)) = 0
于 2012-02-24T22:53:56.713 に答える
3

MS SQL ServerでDATETIMEフィールドのDATE部分を取得する方法:

これを行うための最も迅速で最も簡単な方法の1つは、

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

これにより、CPUが「日付を時刻なしで文字列に変換してから再度変換する」ロジックを無効にすることを回避できます。

また、日付の「時間部分が分数として表される」という内部実装も公開されていません。

月の初日の日付を取得します

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

1年前の日付rfomを取得します

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
于 2008-08-18T13:26:53.617 に答える
3

この関数Cast(Floor(Cast(GetDate() As Float)) As DateTime)は、時間部分を削除した日時データ型を返し、そのまま使用できます。

Select
*
Table1
Where
Cast(Floor(Cast(Column_DateTime As Float)) As DateTime) = '14-AUG-2008'

また

DECLARE  @p_date DATETIME
SET      @p_date = Cast('14 AUG 2008' as DateTime)

SELECT   *
FROM     table1
WHERE    Cast(Floor(Cast(column_datetime As Float)) As DateTime) = @p_date
于 2008-08-14T09:20:36.843 に答える
1

日付は、文字列比較を使用して sqlserver で比較できます。

DECLARE @strDate VARCHAR(15)
SET @strDate ='07-12-2010'


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
于 2010-12-07T06:15:08.033 に答える
1
DECLARE @Dat

SELECT * 
FROM Jai
WHERE                                                                                                          
CONVERT(VARCHAR(2),DATEPART("dd",Date)) +'/'+                                                              
             CONVERT(VARCHAR(2),DATEPART("mm",Date)) +'/'+              
                     CONVERT(VARCHAR(4), DATEPART("yy",Date)) = @Dat
于 2010-02-16T07:12:34.347 に答える
1
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

これにより、データ時刻と文字列が「YYYY-MM-DD」形式の varchar に変換されます。

これは非常に醜いですが、うまくいくはずです

于 2008-08-14T09:18:37.783 に答える
1

これはまさにあなたがこれをやりたい方法ではないことを知っていますが、それは出発点になる可能性があります:

SELECT *
FROM (SELECT *, DATEPART(yy, column_dateTime) as Year, 
      DATEPART(mm, column_dateTime) as Month, 
      DATEPART(dd, column_dateTime) as Day 
      FROM table1)
WHERE Year = '2008'
AND Month = '8'
AND Day = '14'
于 2008-08-14T09:22:54.547 に答える
0
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
于 2012-01-30T09:49:46.040 に答える
0
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
于 2010-02-16T06:36:34.980 に答える
0

最良の方法は、SQL DATE() 関数を使用して単純に日付部分を抽出することです。

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
于 2015-05-23T15:42:08.920 に答える
-2

sqlserver で

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

C# では、ToShortDateString() 関数を使用して日付値の短い文字列を渡します。サンプル: DateVariable.ToShortDateString();

于 2010-04-03T10:28:38.743 に答える