⑴ sql server 對日期每三天進行分組
1、首先需要一個能生成日期范圍的表值函數
/*
生成一個日期范圍,如2014.01、2014.02...
@Increment步進值
@StartDate開始日期
@EndDate結束日期
----------------------
@SelectedRange返回值名稱(多語句表值函數的返回值必須存放在返回值變數中)
返回表的欄位和類型:
iDateDATETIME,
iYearchar(4),
iMonthchar(2),
iYMCHAR(7)
*/
CREATEFUNCTION[dbo].[DateRange]
(
@Incrementchar(1)='m',
@StartDateDATE='20140101',
@EndDateDATE=null
)
RETURNS@SelectedRangeTABLE
(
iDateDATE,
iYearchar(4),
iMonthchar(2),
iYMCHAR(7)
)
AS
BEGIN
/*.
ThefunctionGETDATE(),soitisnotaconstantexpression.
*/
--IF@EndDateisnull
--SET@EndDate=getdate()
--or
SET@EndDate=Coalesce(@EndDate,GetDate())
;WITHcteRange(DateRange)AS
(
SELECTCAST(@StartDateASDATE)
UNIONALL
SELECT
CASE
WHEN@Increment='d'THENDATEADD(dd,1,DateRange)
WHEN@Increment='w'THENDATEADD(ww,1,DateRange)
WHEN@Increment='m'THENDATEADD(mm,1,DateRange)
END
FROMcteRange
WHEREDateRange<=
CASE
WHEN@Increment='d'THENDATEADD(dd,-1,@EndDate)
WHEN@Increment='w'THENDATEADD(ww,-1,@EndDate)
WHEN@Increment='m'THENDATEADD(mm,-1,@EndDate)
END
)
INSERTINTO@SelectedRange(iDate,iYear,iMonth,iYM)
SELECTDateRange,YEAR(DateRange)[Year],MONTH(DateRange)[Month],CONVERT(VARCHAR(7),DateRange,102)[YM]
FROMcteRange
OPTION(MAXRECURSION0);
RETURN
END
2、使用示例:
SELECT*FROMDateRange('d','2018-01-01','2018-06-01')
4、使用上面的查詢去關聯帶值的表,然後進行SUM即可實現
⑵ sql 按時間分組排序寫法
資料庫軟體不支持這樣的輸出方法,這個是報表軟體乾的事情,如果想隨意輸出樣式,那要報表軟體幹嘛,開發報表軟體就是為了解決這個事情的。
⑶ SQL: 一般情況按年分組,特殊年份按指定日期分組,SELECT語句怎麼寫
如果只是一年的話還好說,如果是三四年那就麻煩了,但是如果每一年都要這樣還反而簡單了,最怕的就是某些特殊要求,那樣不好寫。
我寫一個一年的,寫一個全部的。
這是一年的,可能casewhen不能這么直接放在groupby的後面,那麼可以先這么改造一下表,然後外面在套一層select就可以實現了。
select case when year(日期)=2017 and month(日期)<5 then '2017-05-01以前'
when year(日期)=2017 and month(日期)>4 then '2017-05-01至年底' else year(日期) end
年份,count(*) from table group by
(case when year(日期)=2017 and month(日期)<5 then '2017-05-01以前'
when year(日期)=2017 and month(日期)>4 then '2017-05-01至年底' else year(日期) end)
全部的
select concat(year(日期),case when month(日期)<5 then 1 else 2 end) 組合欄位,count(*) from table group by concat(year(日期),case when month(日期)<5 then 1 else 2 end)
其實是一樣的,就是把原表改了一下,只是這兩種情況是比較好改的,如果有三年或者四年是需要進行這樣的分組,那就麻煩了。如果有這種情況,建議在表中加一個標示欄位,那樣就能簡單一些了。
⑷ SQL根據時間分組問題
在分組的時候使用得到日期年份的函數year()進行分組就可以了.
select year(aghqjtsj01) as f_log_time,count(1) as counts from t_handleresou_log group by year(f_log_time)
⑸ SQL 按日期時間分組語句的寫法
對,sql對DateTime類型數據操作時都會精確到毫秒,而用了CONVERT(varchar, in_date, 120)後會轉換成yyyy-mm-dd hh:mi:ss(24小時制)格式
⑹ SQL中怎樣對datetime數據類型按日期分組
轉換後如果日期列是datetime的話這樣寫:
select cast(convert(varchar(10),日期,120) as datetime),金額 from 表
轉換後如果日期列為varchar型的話這樣寫:
select convert(varchar(10),日期,120),金額 from 表
以上,希望對你有所幫助!
⑺ 時間段分組的SQL語句請教
select case when convert(char(2),lTime,108)>=0 and convert(char(2),lTime,108)<=1
then '00:00-01:00'
when convert(char(2),lTime,108)>=1 and convert(char(2),lTime,108)<=2
then '01:00-02:00'
when convert(char(2),lTime,108)>=2 and convert(char(2),lTime,108)<=3
then '02:00-03:00'
when convert(char(2),lTime,108)>=3 and convert(char(2),lTime,108)<=4
then '03:00-04:00'
when convert(char(2),lTime,108)>=4 and convert(char(2),lTime,108)<=5
then '04:00-05:00'
when convert(char(2),lTime,108)>=5 and convert(char(2),lTime,108)<=6
then '05:00-06:00'
when convert(char(2),lTime,108)>=6 and convert(char(2),lTime,108)<=7
then '06:00-07:00'
when convert(char(2),lTime,108)>=7 and convert(char(2),lTime,108)<=8
then '07:00-08:00'
when convert(char(2),lTime,108)>=8 and convert(char(2),lTime,108)<=9
then '08:00-09:00'
when convert(char(2),lTime,108)>=9 and convert(char(2),lTime,108)<=10
then '09:00-10:00'
when convert(char(2),lTime,108)>=10 and convert(char(2),lTime,108)<=11
then '10:00-11:00'
when convert(char(2),lTime,108)>=11 and convert(char(2),lTime,108)<=12
then '11:00-12:00'
when convert(char(2),lTime,108)>=12 and convert(char(2),lTime,108)<=13
then '12:00-13:00'
when convert(char(2),lTime,108)>=13 and convert(char(2),lTime,108)<=14
then '13:00-14:00'
when convert(char(2),lTime,108)>=14 and convert(char(2),lTime,108)<=15
then '14:00-15:00'
when convert(char(2),lTime,108)>=15 and convert(char(2),lTime,108)<=16
then '15:00-16:00'
when convert(char(2),lTime,108)>=16 and convert(char(2),lTime,108)<=17
then '16:00-17:00'
when convert(char(2),lTime,108)>=17 and convert(char(2),lTime,108)<=18
then '17:00-18:00'
when convert(char(2),lTime,108)>=18 and convert(char(2),lTime,108)<=19
then '18:00-19:00'
when convert(char(2),lTime,108)>=19 and convert(char(2),lTime,108)<=20
then '19:00-20:00'
when convert(char(2),lTime,108)>=20 and convert(char(2),lTime,108)<=21
then '20:00-21:00'
when convert(char(2),lTime,108)>=21 and convert(char(2),lTime,108)<=22
then '21:00-22:00'
when convert(char(2),lTime,108)>=22 and convert(char(2),lTime,108)<=23
then '22:00-23:00'
when convert(char(2),lTime,108)>=23 and convert(char(2),lTime,108)<=24
then '23:00-00:00'
end as 時間段,sum(lNum)合計
from listtable group by
case when convert(char(2),lTime,108)>=0 and convert(char(2),lTime,108)<=1
then '00:00-01:00'
when convert(char(2),lTime,108)>=1 and convert(char(2),lTime,108)<=2
then '01:00-02:00'
when convert(char(2),lTime,108)>=2 and convert(char(2),lTime,108)<=3
then '02:00-03:00'
when convert(char(2),lTime,108)>=3 and convert(char(2),lTime,108)<=4
then '03:00-04:00'
when convert(char(2),lTime,108)>=4 and convert(char(2),lTime,108)<=5
then '04:00-05:00'
when convert(char(2),lTime,108)>=5 and convert(char(2),lTime,108)<=6
then '05:00-06:00'
when convert(char(2),lTime,108)>=6 and convert(char(2),lTime,108)<=7
then '06:00-07:00'
when convert(char(2),lTime,108)>=7 and convert(char(2),lTime,108)<=8
then '07:00-08:00'
when convert(char(2),lTime,108)>=8 and convert(char(2),lTime,108)<=9
then '08:00-09:00'
when convert(char(2),lTime,108)>=9 and convert(char(2),lTime,108)<=10
then '09:00-10:00'
when convert(char(2),lTime,108)>=10 and convert(char(2),lTime,108)<=11
then '10:00-11:00'
when convert(char(2),lTime,108)>=11 and convert(char(2),lTime,108)<=12
then '11:00-12:00'
when convert(char(2),lTime,108)>=12 and convert(char(2),lTime,108)<=13
then '12:00-13:00'
when convert(char(2),lTime,108)>=13 and convert(char(2),lTime,108)<=14
then '13:00-14:00'
when convert(char(2),lTime,108)>=14 and convert(char(2),lTime,108)<=15
then '14:00-15:00'
when convert(char(2),lTime,108)>=15 and convert(char(2),lTime,108)<=16
then '15:00-16:00'
when convert(char(2),lTime,108)>=16 and convert(char(2),lTime,108)<=17
then '16:00-17:00'
when convert(char(2),lTime,108)>=17 and convert(char(2),lTime,108)<=18
then '17:00-18:00'
when convert(char(2),lTime,108)>=18 and convert(char(2),lTime,108)<=19
then '18:00-19:00'
when convert(char(2),lTime,108)>=19 and convert(char(2),lTime,108)<=20
then '19:00-20:00'
when convert(char(2),lTime,108)>=20 and convert(char(2),lTime,108)<=21
then '20:00-21:00'
when convert(char(2),lTime,108)>=21 and convert(char(2),lTime,108)<=22
then '21:00-22:00'
when convert(char(2),lTime,108)>=22 and convert(char(2),lTime,108)<=23
then '22:00-23:00'
when convert(char(2),lTime,108)>=23 and convert(char(2),lTime,108)<=24
then '23:00-00:00' end
--表是ListTable 時間欄位lTime,數量欄位lNum
⑻ SQL按時間分組查詢
select MONTH(B),sum(A) FROM tt GROUP BY MONTH(B)
⑼ sql語句按照日期分組怎麼寫
1.如果你的時間格式是2012-01-13
17:35:52.217這樣的形式,(主要是那個01不要是1),用下面這個
SELECT
convert(varchar(10),時間,23),SUM(
數字數據
)
FROM
表
group
by
convert(varchar(10),時間,23)
2.如果你的時間格式不是上面的格式,先轉化成datetime:
SELECT
convert(varchar(10),cast(時間
as
datetime),23)
,SUM(數字數據)
FROM
表
group
by
convert(varchar(10),cast(時間
as
datetime),23)
3.如果報錯,請追問~
⑽ 按日期分組的sql,我這里提示為什麼缺少表達式啊
那個回答, 是針對 SQL Server 資料庫的。
你的資料庫, 會不會是 Oracle 啊?
如果是 Oracle 的話, 需要換一個函數。
SQL Server 裡面的
Convert ( VARCHAR(10), 日期, 120)
在 Oracle 裡面, 要修改為:
TO_CHAR( 日期, 'YYYY-MM-DD' )