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

Compare a date string to datetime in SQL Server?

提问人:Guy 提问时间:8/14/2008 最后编辑:RajeshGuy 更新时间:3/9/2016 访问量:267436

问:

在 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:将返回 13 日和 14 日。WHERE (date>'20080813' AND date<'20080815')

@wearejimbo:接近,但没有雪茄! 授予您的徽章。您错过了在 2008 年 8 月 14 日 23:59:001 至 23:59:999(即午夜前不到 1 秒)写入的记录。

sql-server 数据库 t-sql 日期时间

评论


答:

39赞 Guy 8/14/2008 #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”上的任何索引(如果存在)。

评论

12赞 Larry OBrien 9/25/2008
我相信 CAST('14 AUG 2008' as DateTime) 稍微好一点。我认为它更具可读性,我相信 CAST 比 CONVERT() 更具可移植性,因为 CAST() 与 ANSI SQL-92 和 -99 兼容
1赞 Möoz 8/16/2013
您可以使用 BETWEEN 关键字作为此答案的简写。
1赞 Bondolin 8/17/2013
@BorhanMooz,实际上,BETWEEN 不会捕获代码中给出的 >= / < 介数。BETWEEN 是完全包容的(technet.microsoft.com/en-us/library/ms187922.aspx,“结果值”)。
1赞 Lars Mæhlum 8/14/2008 #2
SELECT  *
FROM    table1
WHERE   CONVERT(varchar(10),columnDatetime,121) = 
        CONVERT(varchar(10),CONVERT('14 AUG 2008' ,smalldatetime),121)

这会将 datatime 和字符串转换为格式为“YYYY-MM-DD”的 varchars。

这很丑陋,但应该有效

4赞 Guy 8/14/2008 #3

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

8赞 Yaakov Ellis 8/14/2008 #4

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

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赞 GateKiller 8/14/2008 #5

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

评论

0赞 Manuel Ferreria 5/18/2009
应用于该字段的多个函数(如果已编制索引)不会将其转换为全表扫描吗?
1赞 Jon Limjap 8/14/2008 #6

我知道这不是你想要的方式,但这可能是一个开始:

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'
4赞 ila 8/14/2008 #7

像这样的东西?

SELECT  *
FROM    table1
WHERE   convert(varchar, column_datetime, 111) = '2008/08/14'
20赞 vzczc 8/14/2008 #8

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

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

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

@Guy。我想你会发现这个解决方案的扩展性很好。查看原始查询的查询执行计划

对于我的

3赞 Guy 8/18/2008 #9

如何在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))
0赞 Jai 2/16/2010 #10
SELECT CONVERT(VARCHAR(2),DATEPART("dd",doj)) + 
    '/' + CONVERT(VARCHAR(2),DATEPART("mm",doj)) + 
    '/' + CONVERT(VARCHAR(4),DATEPART("yy",doj)) FROM emp
1赞 Jai 2/16/2010 #11
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
4赞 van 2/16/2010 #12

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

不过,如果您真的只搜索特定或经常搜索,那么我发现的最佳解决方案是将另一个持久化计算列添加到您的表中,该列仅包含 ,并在此列上添加索引:DATEDATE rangesDATE

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

评论

0赞 van 2/16/2010
然后,我建议对大多数数据库可以识别且不依赖于语言/区域设置的日期使用一种 ISO 格式,例如YYYY-MM-DD
-2赞 javad 4/3/2010 #13

在 sqlserver 中

DECLARE @p_date DATE

SELECT * 
FROM table1
WHERE column_dateTime=@p_date

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

1赞 Naresh Goradara 12/7/2010 #14

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

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


SELECT * FROM table
WHERE CONVERT(VARCHAR(15),dtInvoice, 112)>= CONVERT(VARCHAR(15),@strDate , 112)
0赞 Michael Gasa 1/30/2012 #15
SELECT * FROM tablename
WHERE CAST(FLOOR(CAST(column_datetime AS FLOAT))AS DATETIME) = '30 jan 2012'
4赞 Jaider 2/25/2012 #16

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

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
0赞 user4932286 5/23/2015 #17

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

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

评论

0赞 userfuser 10/24/2023
除了 MS SQL 中没有 DATE() 函数。
0赞 Arun 3/8/2016 #18

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