将日期字符串与SQL Server中的日期时间进行比较?

时间:2008-08-14 09:14:08

标签: sql-server database tsql datetime

在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秒)写下的记录。

18 个答案:

答案 0 :(得分:36)

技术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'上的任何索引。

答案 1 :(得分:16)

在SQL Server 2008中,您可以使用新的DATE数据类型

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

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

@Guy。我想你会发现这个解决方案可以很好地扩展。请查看原始查询的query execution plan

对于mine

答案 2 :(得分: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)

答案 3 :(得分: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()的时间会更短。

答案 4 :(得分:4)

这样的东西?

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

答案 5 :(得分:4)

关于您接受的答案中的索引的好处。

但是,如果您真的只搜索特定的DATEDATE 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

答案 6 :(得分:3)

此函数 Cast(Floor(Cast(GetDate()As Float))作为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

答案 7 :(得分:3)

我通常将日期时间转换为日期并进行比较,如下所示:

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

答案 8 :(得分:3)

如何获取MS SQL Server中DATETIME字段的DATE部分:

最快最好的方法之一就是使用

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

它避免了CPU破坏“将日期转换为字符串而没有时间然后再将其转换回来”逻辑。

它也没有公开内部实现,即“时间部分表示为日期的一小部分”。

获取该月第一天的日期

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

获取日期rfom 1年前

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

答案 9 :(得分:1)

SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

这会将日期时间和字符串转换为格式为“YYYY-MM-DD”的varchar。

这非常难看,但应该有效

答案 10 :(得分: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'

答案 11 :(得分:1)

可以使用字符串比较在sql server中比较日期: e.g。

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


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)

答案 12 :(得分: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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp

答案 15 :(得分:0)

SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'

答案 16 :(得分:0)

最好的方法是使用SQL DATE()函数简单地提取日期部分:

SELECT * 
FROM table1
WHERE DATE(column_datetime) = @p_date;

答案 17 :(得分:-1)

在sqlserver

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

在C#中 使用ToShortDateString()函数传递短日期值字符串。 样品:   DateVariable.ToShortDateString();