2011-04-02 60 views
2

我在查询数据库以获取某年的某个月的所有博客文章。日期存储在数据库中YYYY-MM-DD日期的SQL like子句

什么是最好的万无一失的方法只获得某一天和某一年的职位?我试图链接条款一样,但我已经认识到它们会失败的一些方法,例如,如果我使用了语句:

'SELECT * FROM entries WHERE date LIKE \''.$year.'%\' AND date LIKE \'%'.$month_no.'%\'' 

这将失败,如果当月数正好是包含在年份编号的最后3位数字。我是否必须使用正则表达式,如果是这样,有人可以提出我可以使用的声明吗?

+1

当询问SQL或数据库问题时,请告诉我们*您正在使用哪个数据库*。它让我们这些回答问题的人更容易生活。 – APC 2011-04-02 11:18:15

回答

2

我建议用datetime创建另一列(或者如果可能的话,只是日期)。今后要容易得多。

或者,您可以将其转换为日期类型并进行查询。

2

我还以为下面应该解决这个问题:

'SELECT * FROM entries WHERE date LIKE \''.$year.'-'.$month_no.'-%\'' 

但是,你需要确保$year是四位长,$month_no是两位数字的任何脚本语言等你”重新创建查询。

+0

谢谢,我试过了,它没有工作,我认为这一定是因为该字段是日期类型,因为m.genova在 – Inigo 2011-04-02 11:18:21

1

如果DATE字段是DATE TYPE,那么'like'操作符不起作用,您必须在varchar类型中转换日期类型,然后您可以对trasformation的结果使用'like'运算符。

再见

+0

以下说的啊,我明白了。非常感谢 – Inigo 2011-04-02 11:16:24

1

我就遇到了这个时候我做了监控事件的数据库(矿是由事实的我在做什么方面,我的日子其实从早8点在早上跑复杂,所以01/02/2011 07:59:59“实际上会算作1月1日!,你可以做很多事情

你是在某一天之后,你没有提到你从哪种语言调用SQL。

  1. 将日期存储为日期时间,然后使用convert转换为con将其转换为日期,您可以查询为正常日期(请参阅转换为会话)

  2. 存储日期如上,并在之间使用,所以$ date1 = 01/01/2001 00:00:00和$ DATE2 = 2月1日/ 2011〇点00分00秒将

    'select * from entries where date between "'.$date1.'" and "'.$date2.'"' 
    
  3. 跟着你有什么和做什么

    'select * from entries where date = "'.$year.'/'.$month.'/'.$day.'"' 
    

但至少有完整的日期和时间,用户可以仍按时间顺序排列。

1

你不说你正在使用的数据库的味道。大多数产品都支持DATE数据类型,这将是该列的明显选择。

但你实际使用的字符列,那么你可以很容易地通过使用substring()substr()功能,可以解决它没有正则表达式的假设:

'SELECT * FROM entries 
WHERE substr(date, 1, 7) = '.$year.'-'.$month_no 

NB对不起,我不认识你的SQL方言,所以我可能有错误的确切的语法。

4

请..只是使用日期过滤器。这将有助于性能(使用索引)

$query = "SELECT * 
FROM entries 
WHERE date >= '" . $year . "-" . $month_no . "-01' 
    AND date < adddate('" . $year . "-" . $month_no . "-01', interval 1 month)"; 

这是针对MySQL的。对于SQL Server,使用类似的东西,但使用DATEADD代替

... 
WHERE date >= '$year" . $month . "01' 
    AND date < DATEADD(month,1,'$year" . $month . "01'"; 

之所以增加一个月的,这是比较容易处理的情况下每月为12(12月)。

1

万无一失很可能是你的字符串转换为日期:

DECLARE @dateToFind datetime 

SET @dateToFind = CONVERT(datetime, N'2011-04-02', 20) 

SELECT * FROM [table] WHERE CONVERT(datetime, [datefield], 20) = @dateToFind 

或者,如果你需要一个范围:

DECLARE @startDate datetime, @endDate datetime 

SELECT 
    @startDate = CONVERT(datetime, N'2011-04-01', 20), 
    @endDate = CONVERT(datetime, N'2011-04-30', 20) 

SELECT * FROM [table] WHERE CONVERT(datetime, [datefield], 20) BETWEEN @startDate AND @endDate 

或者你可以两次转换:

SELECT * FROM [table] WHERE YEAR(CONVERT(datetime, [datefield], 20)) = 2011 AND MONTH(CONVERT(datetime, [datefield], 20)) = 4 

CONVERT中的数字20与您的日期格式相匹配。