首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得最新的10个星期的信息

获得最新的10个星期的信息
EN

Stack Overflow用户
提问于 2018-10-19 15:55:42
回答 3查看 84关注 0票数 1

我有下面的SQL查询( Server)。我想修改下面的SQL查询,它只保存上一次7天的信息类型“每日评分”的,并为“每周评分”保存10 weeks的信息。任何投入都是有帮助的。

代码语言:javascript
复制
SELECT 'Daily Score' AS Type, 
       product AS Product, 
       CONVERT(VARCHAR, productCreationDate, 23) AS productCreationDate 
FROM   ProductTable 
UNION 
SELECT 'Weekly Score' AS Type, 
       product AS Product, 
       CONVERT(VARCHAR, Dateadd(day, - Datepart(weekday, productCreationDate) + 1, productCreationDate 
       ), 23) 
       + '-' 
       + CONVERT(VARCHAR, Dateadd(day, 7 - Datepart(weekday, productCreationDate), productCreationDate 
       ), 23) AS productCreationDate 
FROM   ProductTable; 
EN

回答 3

Stack Overflow用户

发布于 2018-10-19 16:20:45

我同意Dai的观点,这可能是两个不同的查询,但可以合并为一个来说明数据。

代码语言:javascript
复制
/* Last 7 days. */
SELECT [Type] = 'Daily Score'
    , product
    , productCreationDate /* I included the actual date in the query so you can see the one actually selected. */
    , CONVERT(VARCHAR, productCreationDate, 23) AS productCreationDateAsVarchar
FROM   ProductTable 
WHERE DATEDIFF(day,productCreationDate,getDate()) <= 7

UNION ALL /* UNION ALL is significantly faster than UNION, so if you don't expect dupes, use UNION ALL. */

/* Last 10 weeks */
SELECT [Type] = 'Weekly Score'
       , product
       , productCreationDate
       , CONVERT(
               VARCHAR, 
               Dateadd(day, - Datepart(weekday, productCreationDate) + 1, productCreationDate )
       , 23) 
       + '-' 
       + CONVERT(VARCHAR, Dateadd(day, 7 - Datepart(weekday, productCreationDate), productCreationDate 
       ), 23) AS productCreationDateAsVarchar
FROM   ProductTable
WHERE DATEDIFF(week,productCreationDate,getDate()) <=10

如果我没有弄错的话,在您最初的查询中,productionCreationDate只是对productionCreationDate来自哪个块日期描述的描述,所以它实际上不是一个日期。它可能应该是更具描述性的命名。我不确定这些值是否能给你提供有用的信息。我需要示例数据来验证。

票数 1
EN

Stack Overflow用户

发布于 2018-10-19 16:08:49

我建议使用两个单独的查询,而不是使用UNION,因为两个子查询在概念上表示不同类型的数据(如当前查询中的输出productCreationDate列表示日期或一周)。相反,我会在同一个批处理中使用两个不同的查询(为此可以使用单个SqlCommand.ExecuteDataReader,只需调用NextResult以移动到下一个结果集)。

此外,如果您使用的是周,那么您应该使用一年中的元组和ISO周号,而不仅仅是将日期舍入最近的星期日或星期一(因为这将根据服务器的地区/区域性设置提供不同的结果!)。

最后,我通常建议避免将日期/时间值转换为SQL中的文本,因为这是视图级别的问题(如“生成用户在屏幕上看到的内容的软件”,而不是SQL VIEW btw)。

下面是我的方法(使用所请求的日期范围筛选器):

代码语言:javascript
复制
-- Daily products:
SELECT
    product,
    productCreationDate
FROM
    ProductTable
WHERE
    productCreationDate >= DATEADD( day, -7, GETUTCDATE() ) 

-- Weekly products:
SELECT
    product,
    DATEPART( year, productCreationDate ) AS [year]
    DATEPART( iso_week, productCreationDate ) AS [isoWeek]
FROM
    ProductTable
WHERE
    productCreationDate >= DATEADD( week, -10, GETUTCDATE() ) 

读起来如下:

代码语言:javascript
复制
using( SqlCommand cmd = yourConnection.CreateCommand() )
{
    cmd.CommandText = "SELECT ...";
    using( SqlDataReader rdr = cmd.ExecuteReader() )
    {
        // Read the Daily Products query results:
        while( rdr.Read() )
        {
            // ...
        }

        // Read the Weekly Products query results:
        rdr.NextResult();

        while( rdr.Read() )
        {
            // ...
        }
    } 
}
票数 0
EN

Stack Overflow用户

发布于 2018-10-19 16:16:28

应将筛选器添加到查询中,以便在每个查询中选择适当的记录。

代码语言:javascript
复制
SELECT 'Daily Score' AS Type
       product AS Product,
       CONVERT(VARCHAR, productCreationDate, 23) AS productCreationDate
FROM   ProductTable
WHERE  productCreationDate >= DATEADD(day, -7, GETUTCDATE())
UNION
SELECT 'Weekly Score' AS Type
       product AS Product
       CONVERT(VARCHAR, productCreationDate, 23) AS productCreationDate
FROM   ProductTable
WHERE  productCreationDate >= DATEADD( week, -10, GETUTCDATE() ) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52895982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档