如何格式化MS SQL中的日期通配符查询?

时间:2014-08-06 14:49:39

标签: sql sql-server date formatting

我有一定的日期范围,比方说8-01到8-08。我还有一个拥有1975 - 2014年历史数据的数据库。日期格式为yyyy-mm-dd格式。例如,今天是2014-08-06。我怎样才能获得所有年份的8-01到8-08的历史记录?请记住,我的日期范围在同一个月可能不会很好。另一个例子是7/31到8/07。

基本上,我希望能够做BETWEEN(% - 8-01 AND%-8-08),其中%是通配符。但是,通配符似乎与MS SQL中的日期对象不兼容。我需要将日期转换为字符串吗?获得与年份无关的通用月日范围的最有效方法是什么?

感谢。

4 个答案:

答案 0 :(得分:1)

您可以提取月份和日期部分并进行比较:

where
month(<yourdate>) = 8
and day(<yourdate>) between 1 and 8

请注意,如果您在此列上有索引,则不会以这种方式使用它。

答案 1 :(得分:1)

这是一种与我的其他答案不同的方法。这将使所有日期都为1900年。然后你只需要在你选择的日期之间取任何东西。

SELECT *
FROM   Table1
WHERE  DATEADD
       (
           year,
           -DATEDIFF(year,'19000101',dateField),
           dateField
       ) BETWEEN'19000801' AND'19000818'

答案 2 :(得分:0)

通配符运算符不能在BETWEEN语句中使用。它实际上只适用于LIKE语句。如果您希望能够修改您的年份,那就是它,您应该将其作为参数传递。 BETWEEN语句将毫无问题地接受。

答案 3 :(得分:0)

DECLARE @StartMonth INT
DECLARE @Month INT
DECLARE @EndMonth INT
DECLARE @StartDay INT
DECLARE @Day INT
DECLARE @EndDay INT

SET @StartMonth = 8
SET @EndMonth = 8
SET @StartDay = 1
SET @EndDay = 8

IF @EndMonth > @StartMonth
BEGIN  
    @Month = @EndMonth 
    @StartMonth = @EndMonth
    @EndMonth= @Month 
END
IF @EndDay > @StartDay 
BEGIN  
    @Day= @EndDay 
    @StartDay = @EndDay 
    @EndDay = @Day
END

SELECT *
FROM   TABLE
WHERE  MONTH(dateField) BETWEEN @StartMonthAND @EndMonth 
       AND DAY(dateField) BETWEEN @StartDay AND @EndDay