『壹』 sql日期問題,怎麼樣按記錄里的日期進行分類,15天一檔
不知道你是什麼資料庫,只能寫個意思,具體的內容要你自己搞定。
其實就是把日期欄位截取一下,如果日期本身沒辦法截取,那就轉換一下。比如如果是oracle那麼可以用to_char轉換為字元型,然後再截取。如果擔心1月和10月截取重復,那就多截取一位,或者查找第二個/字元的位置截取。
截取完成後,在用截取後的日期和客戶分組,金額匯總求和就可以了。
我比較熟悉oracle,我用oracle的寫法嘗試這寫一個,如果不是oracle,那麼你就要自己找找類似的了。(日期也可以直接截取,不過好長時間沒寫忘記怎麼寫了,就寫一個轉換的吧)
select
substr(to_char(日期),1,instr(to_char(日期),'/',1,2)-1)
月份,客戶,sum(金額匯總)
from
table
group
by
substr(to_char(日期),1,instr(to_char(日期),'/',1,2)-1)
,客戶
『貳』 SQL查詢如何分配日期
用cross join就好。
如果時間值個數少的話,可以用union all,如下
select *
from a,
(select '2009-11-21' as [date]
union all
select '2009-11-22' as [date]
union all
select '2009-11-23' as [date] ) b
如果多的話,建個臨時表,用循環語句往裡填日期然後再交叉查詢即可。
『叄』 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語句能夠區分出每年的日期。
1. 查看資料庫的版本
select @@version
2. 查看資料庫所在機器操作系統參數
exec master..xp_msver
3. 查看資料庫啟動的參數
sp_configure
4. 查看資料庫啟動時間
select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
查看資料庫伺服器名和實例名
print 'Server Name...............:' + convert(varchar(30),@@SERVERNAME)
print 'Instance..................:' + convert(varchar(30),@@SERVICENAME)
5. 查看所有資料庫名稱及大小
sp_helpdb
重命名資料庫用的SQL
sp_renamedb 'old_dbname', 'new_dbname'
6. 查看所有資料庫用戶登錄信息
sp_helplogins
查看所有資料庫用戶所屬的角色信息
sp_helpsrvrolemember
修復遷移伺服器時孤立用戶時,可以用的fix_orphan_user腳本或者LoneUser過程
更改某個數據對象的用戶屬主
sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
注意:更改對象名的任一部分都可能破壞腳本和存儲過程。
把一台伺服器上的資料庫用戶登錄信息備份出來可以用add_login_to_aserver腳本
查看某資料庫下,對象級用戶許可權
sp_helprotect
7. 查看鏈接伺服器
sp_helplinkedsrvlogin
查看遠端資料庫用戶登錄信息
sp_helpremotelogin
8.查看某資料庫下某個數據對象的大小
sp_spaceused @objname
還可以用sp_toptables過程看最大的N(默認為50)個表
查看某資料庫下某個數據對象的索引信息
sp_helpindex @objname
還可以用SP_NChelpindex過程查看更詳細的索引情況
SP_NChelpindex @objname
clustered索引是把記錄按物理順序排列的,索引占的空間比較少。
對鍵值DML操作十分頻繁的表我建議用非clustered索引和約束,fillfactor參數都用默認值。
查看某資料庫下某個數據對象的的約束信息
sp_helpconstraint @objname
9.查看資料庫里所有的存儲過程和函數
use @database_name
sp_stored_proceres
查看存儲過程和函數的源代碼
sp_helptext '@procere_name'
查看包含某個字元串@str的數據對象名稱
select distinct object_name(id) from syscomments where text like '%@str%'
創建加密的存儲過程或函數在AS前面加WITH ENCRYPTION參數
解密加密過的存儲過程和函數可以用sp_decrypt過程
10.查看資料庫里用戶和進程的信息
sp_who
查看SQL Server資料庫里的活動用戶和進程的信息
sp_who 'active'
查看SQL Server資料庫里的鎖的情況
sp_lock
進程號1--50是SQL Server系統內部用的,進程號大於50的才是用戶的連接進程.
spid是進程編號,dbid是資料庫編號,objid是數據對象編號
查看進程正在執行的SQL語句
dbcc inputbuffer ()
推薦大家用經過改進後的sp_who3過程可以直接看到進程運行的SQL語句
sp_who3
檢查死鎖用sp_who_lock過程
sp_who_lock
11.查看和收縮資料庫日誌文件的方法
查看所有資料庫日誌文件大小
dbcc sqlperf(logspace)
如果某些日誌文件較大,收縮簡單恢復模式資料庫日誌,收縮後@database_name_log的大小單位為M
backup log @database_name with no_log
dbcc shrinkfile (@database_name_log, 5)
12.分析SQL Server SQL 語句的方法:
set statistics time {on | off}
set statistics io {on | off}
圖形方式顯示查詢執行計劃
在查詢分析器-查詢-顯示估計的評估計劃(D)-Ctrl-L 或者點擊工具欄里的圖形
文本方式顯示查詢執行計劃
set showplan_all {on | off}
set showplan_text { on | off }
set statistics profile { on | off }
13.出現不一致錯誤時,NT事件查看器里出3624號錯誤,修復資料庫的方法
先注釋掉應用程序里引用的出現不一致性錯誤的表,然後在備份或其它機器上先恢復然後做修復操作
alter database [@error_database_name] set single_user
修復出現不一致錯誤的表
dbcc checktable('@error_table_name',repair_allow_data_loss)
或者可惜選擇修復出現不一致錯誤的小型資料庫名
dbcc checkdb('@error_database_name',repair_allow_data_loss)
alter database [@error_database_name] set multi_user
CHECKDB 有3個參數:
repair_allow_data_loss 包括對行和頁進行分配和取消分配以改正分配錯誤、結構行或頁的錯誤,以及刪除已損壞的文本對象,這些修復可能會導致一些數據丟失。
修復操作可以在用戶事務下完成以允許用戶回滾所做的更改。
如果回滾修復,則資料庫仍會含有錯誤,應該從備份進行恢復。
如果由於所提供修復等級的緣故遺漏某個錯誤的修復,則將遺漏任何取決於該修復的修復。
修復完成後,請備份資料庫。
repai*_**st 進行小的、不耗時的修復操作,如修復非聚集索引中的附加鍵。
這些修復可以很快完成,並且不會有丟失數據的危險。
repair_rebuild 執行由 repai*_**st 完成的所有修復,包括需要較長時間的修復(如重建索引)。
執行這些修復時不會有丟失數據的危險。
添加、刪除、修改使用db.Execute(Sql)命令執行操作
╔--------------------╗
☆ 數據記錄篩選 ☆
╚--------------------╝
注意:單雙引號的用法可能有誤(沒有測式)
Sql = Select Distinct 欄位名 From 數據表
Distinct函數,查詢資料庫存表內不重復的記錄
Sql = Select Count(*) From 數據表 where 欄位名1#18:0:0# and 欄位名1 #19:00#
count函數,查詢數庫表內有多少條記錄,「欄位名1」是指同一欄位
例:
set rs=conn.execute(select count(id) as idnum from news)
response.write rs(idnum)
sql=select * from 數據表 where 欄位名 between 值1 and 值2
Sql=select * from 數據表 where 欄位名 between #2003-8-10# and #2003-8-12#
在日期類數值為2003-8-10 19:55:08 的欄位里查找2003-8-10至2003-8-12的所有記錄,而不管是幾點幾分。
select * from tb_name where datetime between #2003-8-10# and #2003-8-12#
欄位裡面的數據格式為:2003-8-10 19:55:08,通過sql查出2003-8-10至2003-8-12的所有紀錄,而不管是幾點幾分。
Sql=select * from 數據表 where 欄位名=欄位值 order by 欄位名 [desc]
Sql=select * from 數據表 where 欄位名 like '%欄位值%' order by 欄位名 [desc]
模糊查詢
Sql=select top 10 * from 數據表 where 欄位名 order by 欄位名 [desc]
查找資料庫中前10記錄
Sql=select top n * form 數據表 order by newid()
隨機取出資料庫中的若干條記錄的方法
top n,n就是要取出的記錄數
Sql=select * from 數據表 where 欄位名 in ('值1','值2','值3')
╔--------------------╗
☆ 添加數據記錄 ☆
╚--------------------╝
sql=insert into 數據表 (欄位1,欄位2,欄位3 …) valuess (值1,值2,值3 …)
sql=insert into 數據表 valuess (值1,值2,值3 …)
不指定具體欄位名表示將按照數據表中欄位的順序,依次添加
sql=insert into 目標數據表 select * from 源數據表
把源數據表的記錄添加到目標數據表
╔--------------------╗
☆ 更新數據記錄 ☆
╚--------------------╝
Sql=update 數據表 set 欄位名=欄位值 where 條件表達式
Sql=update 數據表 set 欄位1=值1,欄位2=值2 …… 欄位n=值n where 條件表達式
Sql=update 數據表 set 欄位1=值1,欄位2=值2 …… 欄位n=值n
沒有條件則更新整個數據表中的指定欄位值
╔--------------------╗
☆ 刪除數據記錄 ☆
╚--------------------╝
Sql=delete from 數據表 where 條件表達式
Sql=delete from 數據表
沒有條件將刪除數據表中所有記錄)
╔--------------------------╗
☆ 數據記錄統計函數 ☆
╚--------------------------╝
AVG(欄位名) 得出一個表格欄平均值
COUNT(*|欄位名) 對數據行數的統計或對某一欄有值的數據行數統計
MAX(欄位名) 取得一個表格欄最大的值
MIN(欄位名) 取得一個表格欄最小的值
SUM(欄位名) 把數據欄的值相加
引用以上函數的方法:
sql=select sum(欄位名) as 別名 from 數據表 where 條件表達式
set rs=conn.excute(sql)
用 rs(別名) 獲取統的計值,其它函數運用同上。
╔-----------------------------╗
☆ 數據表的建立和刪除 ☆
╚-----------------------------╝
CREATE TABLE 數據表名稱(欄位1 類型1(長度),欄位2 類型2(長度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 數據表名稱 (永久性刪除一個數據表)
╔--------------------------╗
☆ 記錄集對象的方法 ☆
╚--------------------------╝
rs.movenext 將記錄指針從當前的位置向下移一行
rs.moveprevious 將記錄指針從當前的位置向上移一行
rs.movefirst 將記錄指針移到數據表第一行
rs.movelast 將記錄指針移到數據表最後一行
rs.absoluteposition=N 將記錄指針移到數據表第N行
rs.absolutepage=N 將記錄指針移到第N頁的第一行
rs.pagesize=N 設置每頁為N條記錄
rs.pagecount 根據 pagesize 的設置返回總頁數
rs.recordcount 返回記錄總數
rs.bof 返回記錄指針是否超出數據表首端,true表示是,false為否
rs.eof 返回記錄指針是否超出數據表末端,true表示是,false為否
rs.delete 刪除當前記錄,但記錄指針不會向下移動
rs.addnew 添加記錄到數據表末端
rs.update 更新數據表記錄
用Oracle資料庫!!!!!!!!!!!!!!
『伍』 sql 實現按日期分組
需要用convert函數轉換日期格式,並且需要用group by來實現分組。
1、創建測試表及插入數據:
createtabletest
(tdatedatetime,
salint);
insertintotestvalues('2015-09-2312:22:22',100);
insertintotestvalues('2015-09-2301:54:34',456);
insertintotestvalues('2015-09-2414:32:35',45);
insertintotestvalues('2015-09-2422:23:43',67);
insertintotestvalues('2015-09-2519:43:22',234);
insertintotestvalues('2015-09-2508:14:12',67);
insertintotestvalues('2015-09-2604:53:34',45);
insertintotestvalues('2015-09-2609:46:54',78);
2、執行sql語句:
selectconvert(varchar(10),tdate,120)tdate,sum(sal)salfromtestgroupbyconvert(varchar(10),tdate,120);
3、執行結果:
『陸』 SQL 日期時間拆分問題
--代碼如下:
;withDT_Tableas(
selecttop(datediff(dd,'2010-1-1','2020-1-1'))dateadd(dd,(row_number()over(orderbya.object_id))-1,'2010-1-1')Date_Timefromsys.columnsa,sys.columnsb,sys.columnsc
)
select
b.seq
,convert(varchar(10),a.Date_Time,120)as[date]
,casewhenconvert(varchar(10),a.Date_Time,120)=convert(varchar(10),cast(b.begindateasdatetime),120)thenb.begintimeelse'00:01'endasbegintime
,casewhenconvert(varchar(10),a.Date_Time,120)=convert(varchar(10),cast(b.enddateasdatetime),120)thenb.endtimeelse'23:59'endasendtime
from
DT_Tablea
innerjoin
(
select1seq,'2014-8-1'begindate,'10:00'begintime,'2014-8-3'enddate,'12:00'endtime
unionall
select2,'2014-8-2','9:00','2014-8-3','15:00'
)boncast(b.begindateasdatetime)<=a.Date_Timeandcast(b.enddateasdatetime)>=a.Date_Time
orderby
b.seq,a.Date_Time
以上代碼有局限性的:
1、日期時間段只能在2010-1-1到2020-1-1日之間
2、你的日期和時間必須是標准格式,我未做begindate、begintime、enddate、endtime列的格式檢查,默認你都是正確的日期或時間格式
3、以上腳本只支持SQL2005或以上版本,若是需要SQL2000版本的,可聯系我
下面是執行結果:
『柒』 sql 日期格式轉換
1、首先點擊頂部菜單的【新建查詢】,打開一個SQL輸入窗口。
『捌』 《SQL Server》中如何指定日期格式怎樣指定分隔符
1、《SQL Server》中指定日期格式:
SELECT DATENAME(Year,@dt)+N'年'+DATENAME(Month,@dt)+N'月'+DATENAME(Day,@dt)+N'日'--3.長日期格式:yyyy年m月d日
SELECT DATENAME(Year,@dt)+N'年'+CAST(DATEPART(Month,@dt) AS varchar)+N'月'+DATENAME(Day,@dt)+N'日'--4.完整日期+時間格式:yyyy-mm-dd hh:mi:ss:mmm
SELECT CONVERT(char(11),@dt,120)+CONVERT(char(12),@dt,114)
convert(要保留的字元長度,要格式化的日期,日期顯示類型)
日期顯示類型,參照網路搜索"sql 日期格式"
2、《SQL Server》中指定分隔符:
length
nchar、nvarchar、char、varchar、binary 或 varbinary 數據類型的可選參數。
style
日期格式樣式,藉以將 datetime 或 smalldatetime 數據轉換為字元數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型);或者字元串格式樣式,藉以將 float、real、money 或 smallmoney 數據轉換為字元數據(nchar、nvarchar、char、varchar、nchar 或 nvarchar 數據類型)。
『玖』 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 Server時間與日期分開查詢
sql server 中,
可以用cast()函數將日期時間轉換為日期,
比如:cast('2014-01-22 13:22:35.000' as date) 的結果為2014-01-22
以下語句是查詢2012年的數據,日期范圍可以修改
select * 表名
where CAST(時間欄位 as date) between '2012-01-01' and '2012-12-31'
如果要查全年數據,也可以這樣,
select * 表名 where year(時間欄位)=2012
另外,用convert()函數也可以將日期時間欄位轉換為日期欄位來代替cast,具體用法一下
如果是oracle資料庫請用to_date()代替cast將日期時間欄位轉換為日期來查詢