【问题标题】:sql query to select week,month, dayssql查询选择周、月、日
【发布时间】:2011-02-24 07:30:34
【问题描述】:

拜托,我需要一个 sql 查询来使用 vb6 从 access 数据库中选择数据。该查询将仅提供当前日期,并且已比较的字段为数据库中的 curr_date。

例如

SELECT * 
  FROM TABLE 
 WHERE curr_date BETWEEN firstoflastmonth AND endoflasthmonth;

SELECT * 
  FROM TABLE 
 WHERE curr_date BETWEEN firstoflastweek AND endoflasthweek;

SELECT * 
  FROM TABLE 
 WHERE curr_date BETWEEN firstofthismonth AND endofthismonth;

SELECT * 
  FROM TABLE 
 WHERE curr_date BETWEEN firstofthsiweek AND tilldate;

我想知道的问题是如何指定两个日期进行比较

【问题讨论】:

  • 如何定义“上周”和“上个月”?下周二,3 月 1 日,是上个月的 2 月吗?这不是一件小事——不同的用户可能会以不同的方式解释这些通俗易懂的术语,而不会得到他们期望的结果。

标签: sql ms-access vb6


【解决方案1】:

Date() 函数将返回当前时间戳。使用 ms-access 日期函数从那里向后/向前工作,例如:

DateAdd("m",2,Date())

将两个月添加到当前日期。检查this reference out

【讨论】:

  • 这是真的,我知道这一点。但它没有指定开始和结束日期。不同的月份在不同的日子结束,28 苏姆,30 苏姆,31 苏姆。
  • 顺便说一句,Date() 会返回当前日期,Now() 会返回当前时间戳。
  • 啊,是的,没错。该功能应该仍然有效。顺便说一句,Yohsoog 的想法是正确的。不要使用“between”子句,如果您只想要一个特定的月份或星期,不要费心计算整个范围,只需直接进行“等于”比较即可。
【解决方案2】:

然后检查您希望它在哪个月/周不是最简单的吗?

你的例子:

SELECT *    FROM TABLE   
WHERE curr_date BETWEEN firstoflastmonth AND endoflasthmonth;  

这将变成(使用 month 函数)

SELECT *    FROM TABLE   
WHERE month(curr_date) = month(dateadd("m",-1,Date()));

这会将您的 curr_date 月份与 Date 月份(当前日期)减去一个月,即最后一个月。 这也可以使用datediff

SELECT *    FROM TABLE   
WHERE DateDiff ( "m", curr_date, date()) = 1
AND curr_date < date();

添加最后一行是为了确保不选择一个月后的日期。

使用here找到的日期函数可以将同样的事情应用于其他查询

Richard Calahan 提供的参考表的链接

【讨论】:

  • 第二个 SQL 语句不会使用索引,所以我建议不要这样做。相反,我会找出句号的开始日期和结束日期,并使用这些日期而不是表达式。
  • @David-W-Fenton 因此,如果我理解正确,您仍然会使用类似于请求本身的解决方案(在查询中使用类似 'firstoflastmonth'、'endoflastmonth'、......) ?那么你会如何推荐在通用查询中使用它呢?
  • 关键是您希望有一个 WHERE 子句来测试字段中的索引值。因此,您可以使用表达式,例如BETWEEN DateSerial(Year(Date()),Month(Date()),1) And DateAdd("m", 1, DateSerial(Year(Date()),Month(Date()),1)) - 1。它使用表达式来计算您正在测试的值,但您正在测试的是一个索引字段。
  • 我不想在这里开始讨论,但我真的很感兴趣。首先:在您的第一条评论中,您提到了第二条 SQL 语句。那是关于带有 dateadd() 函数或 datediff() 函数的那个​​吗?我问这是因为在我看来,我的 dateadd() 示例确实与您建议的索引值 (curr_date) 进行了比较。但是,我可以在上一个示例中看到您的评论,其中我在表达式本身中使用了索引值。我不知道这不会使用索引。
【解决方案3】:

见:

Why should I consider using an auxiliary calendar table?

本文的代码专门针对 SQL Server,但这些技术可移植到大多数 SQL 平台(甚至 MS Access :) 其想法是 SQL 是一种声明性语言,并且将支持基于数据驱动的基于集合的解决方案而不是计算-procedurally-on-the-fly 方法。

您的企业每天需要一行,涵盖几十年不会太多(数千行)。那些日子里的每一天都会有firstoflastmonthfirstoflastweek等的值(但请注意tilldate的含义);这些值生成一次,例如使用电子表格。然后,您可以使用 NOW()、Access 的(ACE、Jet 等)实现标准 SQL 的 CURRENT_TIMESTAMPJOIN 访问此表。

进一步注意,由于 Access 使用双浮点值对所有时间数据建模,BETWEENs euality 操作通常不合适。所以而不是这样:

SELECT * 
  FROM TABLE 
 WHERE curr_date BETWEEN firstoflastmonth AND endoflasthmonth;

...改为使用这个

SELECT * 
  FROM TABLE 
 WHERE (
        curr_date >= firstoflastmonth 
        AND curr_date < firstofthishmonth
       );

【讨论】:

  • 你还没有回答我的问题。我如何获得日期
  • @Smith:与 SQL 中的任何内容相同:将值放入表中并查询它们。确定上周的第一天是 2011-02-24(星期日?星期一?)并将其粘贴在日历表中。对本月的第一天、上个月的第一天以及其他所有时间执行相同的操作。然后在可预见的将来的所有其他日子里做同样的事情。当然,会有一万个或更多,但你只需要做一次。使用 Excel。
猜你喜欢
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2017-01-08
  • 2010-09-11
  • 2011-09-11
相关资源
最近更新 更多