如何使用带日期条件的选择?

时间:2009-03-30 08:42:57

标签: sql sql-server

在sqlserver中,如何比较日期? 例如:

从注册日期> ='1/20/2009'的用户中选择*

(RegistrationDate是日期时间类型)

由于

6 个答案:

答案 0 :(得分:11)

如果你放入

SELECT * FROM Users WHERE RegistrationDate >= '1/20/2009' 

它会自动将字符串'1/20/2009'转换为DateTime格式,日期为1/20/2009 00:00:00。因此,通过使用>=,您应该获得注册日期为1/20/2009或更近的每个用户。

编辑:我把它放在评论部分,但我也应该把它链接到这里。这篇文章详细介绍了在查询中使用DateTime的更深入方式:http://www.databasejournal.com/features/mssql/article.php/2209321/Working-with-SQL-Server-DateTime-Variables-Part-Three---Searching-for-Particular-Date-Values-and-Ranges.htm

答案 1 :(得分:2)

select sysdate from dual
30-MAR-17

select count(1) from masterdata where to_date(inactive_from_date,'DD-MON-YY'
between '01-JAN-16' to '31-DEC-16'

12998 rows

答案 2 :(得分:1)

Select * from Users where RegistrationDate >= CONVERT(datetime, '01/20/2009', 103)

可以安全使用,与服务器上的日期设置无关。

可以找到完整的样式列表here

答案 3 :(得分:0)

我总是将过滤日期变为日期时间,没有时间(时间= 00:00:00.000)

DECLARE @FilterDate  datetime --final destination, will not have any time on it
DECLARE @GivenDateD  datetime --if you're given a datetime
DECLARE @GivenDateS  char(23) --if you're given a string, it can be any valid date format, not just the yyyy/mm/dd hh:mm:ss.mmm that I'm using

SET @GivenDateD='2009/03/30 13:42:50.123'
SET @GivenDateS='2009/03/30 13:42:50.123'

--remove the time and assign it to the datetime
@FilterDate=dateadd(dd, datediff(dd, 0, @FilterDateD), 0)
--OR
@FilterDate=dateadd(dd, datediff(dd, 0, @FilterDateS), 0)

您可以使用此WHERE子句进行过滤:

WHERE ColumnDateTime>=@FilterDate AND ColumnDateTime<@FilterDate+1

这将提供2009/03/30日开始或之后的所有比赛,直至并包括2009/03/30的完整日期

您也可以对START和END过滤器参数执行相同的操作。始终将开始日期设为日期时间,并在所需日期使用零时间,并使条件为“&gt; =”。始终将结束日期设置为您想要的第二天的零时间并使用“&lt;”。这样做,无论日期的时间部分如何,您都将始终正确地包含任何日期。

答案 4 :(得分:0)

另一个功能是

Select * from table where date between '2009/01/30' and '2009/03/30'

答案 5 :(得分:0)

如果您不想被日期格式打扰,可以将该列与常规日期格式进行比较,例如

select * From table where cast (RegistrationDate as date) between '20161201' and '20161220'

确保日期为DATE格式,否则为cast (col as DATE)