【问题标题】:How to dynamically call date instead of hardcoding in WHERE clause?如何在 WHERE 子句中动态调用日期而不是硬编码?
【发布时间】:2017-08-16 19:41:40
【问题描述】:

在我使用 SQL Server 的代码中,我比较了两个月之间的数据,其中我确定了确切的日期。我试图找出某个列中的值是否在一堆不同的场景中发生变化。这部分有效,但我想做的是做到这一点,这样我就不必每次想要得到我正在寻找的结果时都回去更改日期。这可能吗?

我的想法是添加 WITH 子句,但它给了我一个聚合错误。无论如何我可以让这个日期问题更简单吗?提前致谢

编辑

好的,我想澄清一下。在我的 WITH 语句中,我有:

 select distinct
 d.Date
 from Database d

返回:

+------+-------------+
|      | Date        |
+------+-------------|
|    1 |  01-06-2017 | 
|    2 |  01-13-2017 |
|    3 |  01-20-2017 |
|    4 |  01-27-2017 |
|    5 |  02-03-2017 |
|    6 |  02-10-2017 |
|    7 |  02-17-2017 |
|    8 |  02-24-2017 |
|    9 |   ........  |
+------+-------------+

如果我选择此语句并执行,它将只返回我的表中的日期,如上所示。我想做的是能够让sql从这些日期值中提取,并将一个月的最后一个日期值与下个月的最后一个日期值进行比较。本质上,它应该将日期 8 的值与日期 4 的值进行比较,但它应该足够动态,以至于它可以对任意两个日期执行相同的操作,而无需进行太多修改。

【问题讨论】:

  • 您可以将其包装在一个存储过程中,该过程接受可以简化它的参数。您将始终需要提供日期值除非您描述了一些自动派生它们的逻辑这是什么类型的数据库?
  • 应该在 begindate 和 enddate 之间使用 date1 吗?
  • 所以你想让它随着当前日期自动滚动?请详细说明规则。如果今天是 3 月 24 日星期五,要使用的开始日期和结束日期是什么?
  • @programr .. 这应该可以帮助您确定每个问题的动态日期。
  • 我仍然对您需要什么感到困惑。添加一些数据样本和预期结果。

标签: sql sql-server date with-statement


【解决方案1】:

如果我没有误解您的要求,您似乎需要一个数字表,也称为计数表,或者在本例中为日历表。

推荐帖:https://dba.stackexchange.com/questions/11506/why-are-numbers-tables-invaluable

基本上,您创建一个表格并在其中填充年份的周数、开始日期和结束日期。然后将您的主查询加入到该表中。

+------+-----------+----------+
| week | startDate | endDate  |
+------+-----------+----------+
|    1 |  20170101 | 20170107 |
|    2 |  20170108 | 20170114 |
+------+-----------+----------+

Select b.week, max(a.data) from yourTable a 
 inner join calendarTable b 
  on a.Date between b.startDate and b.endDate
group by b.week

【讨论】:

    【解决方案2】:

    按 BETWEEN 过滤的动态日期

    select dateadd(m,-1,dateadd(day,-(datepart(day,cast(getdate() as date))-1),cast(getdate() as date)))  -- 1st date of last month
    
    select dateadd(day,-datepart(day,cast(getdate() as date)),cast(getdate() as date))  -- last date of last month
    
    select dateadd(day,-(datepart(day,cast(getdate() as date))-1),cast(getdate() as date))  -- 1st date of current month
    
    select   dateadd(day,-datepart(day,dateadd(m,1,cast(getdate() as date))),dateadd(m,1,cast(getdate() as date))) -- last date of the month
    

    【讨论】:

    • 这应该可以帮助您确定每个问题的动态日期。
    • 这些不是子查询。这是获取动态日期的公式。简而言之,任何你喜欢的地方。
    猜你喜欢
    • 2020-08-24
    • 2023-01-08
    • 1970-01-01
    • 2021-05-19
    • 2020-04-08
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多