質問

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 で最も検索するトピックであるため、この質問に対する私自身の回答を投稿するつもりです。


アップデート より具体的に例を明確にしました。


編集 申し訳ありませんが、間違った回答 (間違った結果を返す回答) をダウンモッドする必要がありました。

@ジョリット: WHERE (date>'20080813' AND date<'20080815') 13日と14日を返します。

@ウェアジンボ: 近くにありますが、葉巻はありません。 あなたに授与されたバッジ。2008 年 8 月 14 日 23:59:001 から 23:59:999 までに書き込まれたレコードを見逃しました (つまり、真夜中の 1 秒未満です。)

役に立ちましたか?

解決

テクニック 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」が存在する場合、そのインデックスを使用できることです。

他のヒント

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

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

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

@男。このソリューションは適切に拡張できることがわかると思います。を見てください。 クエリ実行計画 元のクエリの。

そして、のために 私の:

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

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)

このようなもの?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'

テクニック 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() を使用する方が時間がかかります。

あなたが受け入れた回答のインデックスに関する良い点。

それでも、実際に特定のものだけを検索する場合は、 DATE または DATE ranges 頻繁, 、その場合、私が見つけた最良の解決策は、テーブルに別の永続化された計算列を追加することです。 DATE, 、この列にインデックスを追加します。

ALTER TABLE "table1" 
    ADD "column_date" AS CONVERT(DATE, "column_datetime") PERSISTED

その列にインデックスを追加します。

CREATE NONCLUSTERED INDEX "table1_column_date_nu_nci"
ON  "table1" ( "column_date" ASC )
GO

そうすれば、検索はさらに高速になります。

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

SELECT   *
FROM     table1
WHERE    column_date = @p_date

この機能 Cast(Floor(Cast(GetDate() As Float)) As DateTime) 時刻部分が削除された 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

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

これを行うための最も迅速かつ適切な方法の 1 つは、

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

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

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

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

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

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

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

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

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

これがあなたが望んでいることではないことはわかっていますが、手始めとしては次のような方法が考えられます。

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'
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

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

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

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

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


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
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

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

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

SQL では日付の形式が多数指定されています。参照する https://msdn.microsoft.com/en-in/library/ms187928.aspx

varchar 列を変換し、選択した日付と比較します。

構文:

SELECT * FROM tablename where CONVERT(datetime,columnname,103) 
    between '2016-03-01' and '2016-03-03'
In CONVERT(DATETIME,COLUMNNAME,103) "103" SPECIFIES THE DATE FORMAT as dd/mm/yyyy

SQLサーバー内

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top