Sql 是否可以使用时间戳值按天、月或年分组?

Sql 是否可以使用时间戳值按天、月或年分组?,sql,sql-server,Sql,Sql Server,我有一个表ORDERS(idOrder,idProduct,Qty,OrderDate)其中OrderDate是一个带有时间戳值的varchar列,是否可以获取每天、每周、每月或每年的Qty 该表如下所示: --------------------------------------- |idOrder | idProduct | Qty | OrderDate| --------------------------------------- | 1 | 5 | 20

我有一个表
ORDERS(idOrder,idProduct,Qty,OrderDate)
其中
OrderDate
是一个带有时间戳值的varchar列,是否可以获取每天、每周、每月或每年的
Qty

该表如下所示:

---------------------------------------
|idOrder | idProduct | Qty | OrderDate|
---------------------------------------
| 1      |  5        | 20  | 1504011790 |
| 2      |  5        | 50  | 1504015790 |
| 3      |  5        | 60  | 1504611790 |
| 4      |  5        | 90  | 1504911790 | 
-----------------------------------------
我想要这样的东西

------------------------------
| idProduct | Qty | OrderDate|
-------------------------------
|  5        | 70  | 08/29/2017|
|  5        | 60  | 09/05/2017|
|  5        | 90  | 09/08/2017| 
-------------------------------
是的,很简单:

TRUNC ( date [, format ] )
格式可以是:

TRUNC(TO_DATE('22-AUG-03'), 'YEAR')
Result: '01-JAN-03'

TRUNC(TO_DATE('22-AUG-03'), 'MONTH')
Result: '01-AUG-03'

TRUNC(TO_DATE('22-AUG-03'), 'DDD')
Result: '22-AUG-03'

TRUNC(TO_DATE('22-AUG-03'), 'DAY')
Result: '17-AUG-03'
是的,很简单:

TRUNC ( date [, format ] )
格式可以是:

TRUNC(TO_DATE('22-AUG-03'), 'YEAR')
Result: '01-JAN-03'

TRUNC(TO_DATE('22-AUG-03'), 'MONTH')
Result: '01-AUG-03'

TRUNC(TO_DATE('22-AUG-03'), 'DDD')
Result: '22-AUG-03'

TRUNC(TO_DATE('22-AUG-03'), 'DAY')
Result: '17-AUG-03'

不幸的是,TSQL时间戳数据类型实际上不是日期。据报道,他们甚至改变了名字,因为这是一个用词不当。最好使用DEFAULT=GETDATE()创建一个DATETIME字段,以便准确记录行的创建时间


话虽如此,我所见过的跟踪日期到日/周/月/季/等的最有效的方法是使用一个日期维度表,该表只列出每个日期,并具有WeekOfMonth和DayOfYearand等字段。一旦您将新的DateCreated字段加入其中,您就可以获得有关该日期的各种信息。您可以通过谷歌搜索脚本为您创建日期维度表。

不幸的是,TSQL时间戳数据类型实际上不是日期。据报道,他们甚至改变了名字,因为这是一个用词不当。最好使用DEFAULT=GETDATE()创建一个DATETIME字段,以便准确记录行的创建时间


话虽如此,我所见过的跟踪日期到日/周/月/季/等的最有效的方法是使用一个日期维度表,该表只列出每个日期,并具有WeekOfMonth和DayOfYearand等字段。一旦您将新的DateCreated字段加入其中,您就可以获得有关该日期的各种信息。您可以用谷歌搜索脚本,为您创建一个日期维度表。

看起来您需要在这里做两件事:第一,根据您的idProduct和OrderDate进行分组

按idProduct、OrderDate从[yourtable]组中选择idProduct、sum(Qty)、OrderDate

这会给你想要的总数。接下来,您要转换时间格式。我假设您的邮票使用的是纪元时间(1970年1月1日起的秒数),因此转换它们的形式为:
dateadd(s,[您的时间域],'19700101')

看起来您还希望将日期格式化为mm/dd/yyyy。
convert(NVARCHAR,[date],101)
是实现这一点的格式

一起:

选择idProduct、sum(数量)、convert(NVARCHAR、dateadd(s、OrderDate、'19700101')、101)
从[你的桌子]

按idProduct、OrderDate分组看起来您需要在这里做两件事:第一,按idProduct和OrderDate分组

按idProduct、OrderDate从[yourtable]组中选择idProduct、sum(Qty)、OrderDate

这会给你想要的总数。接下来,您要转换时间格式。我假设您的邮票使用的是纪元时间(1970年1月1日起的秒数),因此转换它们的形式为:
dateadd(s,[您的时间域],'19700101')

看起来您还希望将日期格式化为mm/dd/yyyy。
convert(NVARCHAR,[date],101)
是实现这一点的格式

一起:

选择idProduct、sum(数量)、convert(NVARCHAR、dateadd(s、OrderDate、'19700101')、101)
从[你的桌子]

按idProduct分组,OrderDate

用您正在使用的数据库标记您的问题,并提供样本数据和所需结果。用您正在使用的数据库标记您的问题,并提供样本数据和所需结果。很抱歉,我想我误导了您,因为我没有看到我的表格的外观。我会告诉您日期,TRUNC是您需要的;)我正在使用sql server,我相信TO_DATE是Oracle函数^“哦,我明白了!在这种情况下,请尝试--将当前日期转换为YYYY-MM-DD格式,选择Convert(VARCHAR(10),GETDATE(),120);很抱歉,我想我误导了您,因为我没有看一眼我的表的外观。我正在使用sql server,我相信是Oracle的功能。^^“哦,我明白了!在这种情况下,试一试——将当前日期转换为YYYY-MM-DD格式,选择Convert(VARCHAR(10),GETDATE(),120);哦!谢谢SOO MUCHO_O!非常感谢,非常感谢,我一直在寻找这个解决方案,直到@MattDekinder给了我想要的东西。^“非常感谢,我一直在寻找这个解决方案,直到@MattDekinder给了我想要的东西。^”