我有下面的SQL查询( Server)。我想修改下面的SQL查询,它只保存上一次7天的信息类型“每日评分”的,并为“每周评分”保存10 weeks的信息。任何投入都是有帮助的。
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; 发布于 2018-10-19 16:20:45
我同意Dai的观点,这可能是两个不同的查询,但可以合并为一个来说明数据。
/* 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来自哪个块日期描述的描述,所以它实际上不是一个日期。它可能应该是更具描述性的命名。我不确定这些值是否能给你提供有用的信息。我需要示例数据来验证。
发布于 2018-10-19 16:08:49
我建议使用两个单独的查询,而不是使用UNION,因为两个子查询在概念上表示不同类型的数据(如当前查询中的输出productCreationDate列表示日期或一周)。相反,我会在同一个批处理中使用两个不同的查询(为此可以使用单个SqlCommand.ExecuteDataReader,只需调用NextResult以移动到下一个结果集)。
此外,如果您使用的是周,那么您应该使用一年中的元组和ISO周号,而不仅仅是将日期舍入最近的星期日或星期一(因为这将根据服务器的地区/区域性设置提供不同的结果!)。
最后,我通常建议避免将日期/时间值转换为SQL中的文本,因为这是视图级别的问题(如“生成用户在屏幕上看到的内容的软件”,而不是SQL VIEW btw)。
下面是我的方法(使用所请求的日期范围筛选器):
-- 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() ) 读起来如下:
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() )
{
// ...
}
}
}发布于 2018-10-19 16:16:28
应将筛选器添加到查询中,以便在每个查询中选择适当的记录。
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() ) https://stackoverflow.com/questions/52895982
复制相似问题