我有以下SQL查询(SQL Server)。我想修改以下SQL查询,使其仅保留类型为“每日得分”的信息的最后 7天 并保存 10周的“每周得分”信息。任何输入都会有所帮助。
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;
答案 0 :(得分:1)
我同意Dai的看法,这些可能应该是2个不同的查询,但是可以将它们合并为一个数据说明。
/* 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 :(得分:0)
我建议您使用两个单独的查询,而不要使用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() )
{
// ...
}
}
}
答案 2 :(得分:0)
应将过滤器添加到查询中,以便您在每个查询中选择适当的记录。
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() )