在SQL Server中比较datestring和date时间?

在SQL Server中,我有一个包含时间元素的DATETIME列。

例:

 '14 AUG 2008 14:23:019' 

什么是最好的方法,只select特定的一天的logging,忽略时间部分?

示例:(不安全,因为它不匹配时间部分并且不返回任何行)

 DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 ) SELECT * FROM table1 WHERE column_datetime = @p_date 

注意:鉴于这个网站也是logging笔记和技术,你拿起,然后忘记,我要发布我自己的答案这个问题作为date时间在MSSQL中的东西可能是我在SQLBOL查找最多的话题。


更新澄清的例子更具体。


编辑对不起,但我不得不下降错误的答案(回答错误的结果)。

@Jorrit:在WHERE (date>'20080813' AND date<'20080815')将返回13日和14日。

@wearejimbo: closures,但没有雪茄! 徽章授予你。 您错过了14/08/2008 23:59:001至23:59:999(即午夜前不到1秒)的logging。

技术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数据types

 DECLARE @pDate DATE='2008-08-14' SELECT colA, colB FROM table1 WHERE convert(date, colDateTime) = @pDate 

@Guy。 我想你会发现这个解决scheme的规模很好。 查看原始查询的查询执行计划 。

对我而言 :

只是比较年,月和日的价值。

 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()会更短。

你接受的答案中的索引好点。

不过,如果你真的只在特定的DATEDATE rangessearch,那么我发现的最佳解决scheme是将另一个持久计算列添加到只包含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 

那么你的search会更快:

 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数据types,其中的时间部分被删除,可以这样使用。

 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部分:

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

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

它避免了CPU把“把date转换成一个没有时间的string再转换回来”的逻辑。

它也没有公开内部实现的“时间部分表示为分数”的date。

获取当月的第一天的date

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

1年前获得daterfom

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

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

 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 
 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 

我知道这不完全是你想要做的,但这可能是一个开始:

 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) 

这将把数据时间和string转换成“YYYY-MM-DD”格式的variables。

这是非常丑陋的,但应该工作

date可以在sqlserver中使用string比较进行比较:例如

 DECLARE @strDate VARCHAR(15) SET @strDate ='07-12-2010' SELECT * FROM table WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112) 

最好的方法是使用SQL DATE()函数简单地提取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中有很多date格式正在被指定。 请参阅https://msdn.microsoft.com/en-in/library/ms187928.aspx

转换和比较varchar列与选定的date。

句法:

 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 

在sqlserver中

 DECLARE @p_date DATE SELECT * FROM table1 WHERE column_dateTime=@p_date 

在C#中使用ToShortDateString()函数传递date值的短string。 示例:DateVariable.ToShortDateString();