在SQL Server中将日期字符串与datetime进行比较?

时间:2020-03-05 18:39:35  来源:igfitidea点击:

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

解决方案

回答

技术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'上的任何索引(如果存在)。

回答

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

这会将数据时间和字符串转换为格式为" YYYY-MM-DD"的varchars。

这很丑陋,但应该可以

回答

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

回答

只需比较年,月和日的值即可。

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)

回答

此函数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

回答

我知道这并不是我们要执行的操作,但这可能是一个开始:

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, column_datetime, 111) = '2008/08/14'

回答

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

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

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

@Guy。我认为我们会发现此解决方案可以很好地扩展。查看原始查询的查询执行计划。

对于我来说:

回答

如何获取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))

回答

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

回答

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

回答

关于我们接受的答案中索引的要点。

不过,如果我们确实经常只在特定的" 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

回答

在sqlserver中

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

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

回答

可以使用字符串比较在sqlserver中比较日期:
例如

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

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