sqlhhmm
Ⅰ 如何使用Oracle選擇出每日9:01至9:42時段的數據呢請教大蝦了。
首先你必須有一個欄位供比較,一般來說是一個date型的欄位, 假設欄位名 time
select * from table
where time >= to_date(to_char(time,'yyyymmdd')||'0901' , 'yyyymmddhh24mi') -- 當天的9:01
and time <= to_date(to_char(time,'yyyymmdd')||'0942' , 'yyyymmddhh24mi') -- 當天的9:42
你也可以用between的語法
如果有其他的欄位可以代替to_char(time,'yyyymmdd') -- 當天的日期 更好
你可以直接用 select to_char(time,'yyyymmdd') from table 看看效果
Ⅱ 怎麼生成流水號
目前是在.net中使用的這個方法,使用sqlserver的時間戳來控制並發情況下容易產生重復序列號的問題。
原理類似hibernate的主鍵生成機制,在系統啟動時從資料庫中讀出最大的流水號,賦給一個類的靜態變數,需要時,從該靜態變數中取得流水號,加1後,就是你要的值。
代碼:
public class testA {
public static Long maxNo;
static {
synchronized(maxNo){
maxNo = select max(maxNo) from DB;
}
}
public synchronized static long getMaxNo(){
return(++maxNo);
}
}
優點:保證同步,不會取到相同的值,同時避免了資料庫的反復讀取。
缺點:在cluster環境下
還是用上面的方法,但是只能在一台機器上發布並且綁定到JNDI,別的機器可以通過配置文件得知去哪裡產生maxNo(實際上,每台機器都可以發布,但是所有機器只能去訪問指定的一台機器),這樣的效率雖然低了點,但是還是覺得比每次去資料庫里取好點。當然,可以改進,就是再加一個本地類,每次去JNDI那裡的類去取數據時,一次取20個回來(就是JNDI上面的類一次要加20),以後本地就用這20個值,用完了,再去JNDI上面的類去取。
當然,前面的這兩個例子都比較復雜,甚至還有人提出用單態的方法。而我在.net中用的就比較簡單了。方法如下:
在資料庫(sqlserver)中新建一張表(sequence_num),專門用來生成流水號。
欄位1:s_id,varchar(50),notnull
欄位2:tmstmp,timestamp,notnull
代碼如下:
public string getOderid()
{
private SqlConnection conn = null;
private SqlCommand comm = null;
private string s_id = "";
private byte [] tmstmp;//時間戳類型在.net中對應為一個byte數組
private int s_idplus = 0;
private string orderid = "";
try
{
conn = SqlConn.getConn();
conn.Open();
do
{
string sqlQuery = "select s_id,tmstmp as tmstmp from sequence_num";
comm = conn.CreateCommand();
comm.CommandText = sqlQuery;
SqlDataAdapter da = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
dt.Clear();
da.Fill(dt);
comm.Parameters.Clear();
if (!dt.Rows[0]["s_id"].ToString().Substring(0,12).Equals(DateTime.Now.ToString("yyyyMMddHHmm")))//每一分鍾重置一次計數,實際上我認為每天重置一次比較好
{
s_id = DateTime.Now.ToString("yyyyMMddHHmm")+"0001";
tmstmp = (byte[])dt.Rows[0]["tmstmp"];
}
else
{
s_id = dt.Rows[0]["s_id"].ToString();
tmstmp = (byte[])dt.Rows[0]["tmstmp"];
s_idplus = Convert.ToInt32(s_id.Substring(12)) + 1;
s_id = s_id.Substring(0,12)+Convert.ToString(s_idplus).PadLeft(4,'0');
}
string sqlUpdate = "update sequence_num set s_id = @s_id where tmstmp = @tmstmp";//保證在記錄未被修改的情況下更新,如果更新不成功,則重走一遍生成序列號的流程
comm.CommandText = sqlUpdate;
comm.Parameters.Clear();
comm.Parameters.Add("@s_id",SqlDbType.VarChar,50);
comm.Parameters["@s_id"].Value = s_id;
comm.Parameters.Add("@tmstmp",SqlDbType.Timestamp);
comm.Parameters["@tmstmp"].Value = tmstmp;
}
while(comm.ExecuteNonQuery()<=0);
}
catch(SqlException ex)
{
string aaa = ex.Message;
}
finally
{
if(conn!=null)
{
conn.Close();
}
}
return s_id;
}
這個流程都是在.net里實現的,實際使用中可以通過存儲過程來實現。當然,這種方法對資料庫的訪問會比較頻繁,另外,資料庫表建立的時候必須插入一條初始值,這是代碼不完善的地方,有時間的話我會去完善它。只是判斷如果表內沒有記錄的情況下就插入一條初始記錄,這個時候如何處理並發問題還沒想明白。
Ⅲ SQL怎麼取當前時間是YYYYMMDDHHMMSS格式的
首先,你欄位就不應該設置成datetime類型
欄位類型設置成varchar(14)才可以
給你舉個例子
建表,里邊帶默認值,也就是你描述的那樣的默認值
createtabletest
(idint,
timevarchar(14)defaultreplace(replace(replace(convert(varchar,getdate(),120),'-',''),'',''),':',''))
插入數據
insertintotest(id)values(1)
檢查結果
Ⅳ 求ORACLE SQL下的日期函數
1. 日期和字元轉換函數用法(to_date,to_char)
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from al; //日期轉化為字元串
select to_char(sysdate,'yyyy') as nowYear from al; //獲取時間的年
select to_char(sysdate,'mm') as nowMonth from al; //獲取時間的月
select to_char(sysdate,'dd') as nowDay from al; //獲取時間的日
select to_char(sysdate,'hh24') as nowHour from al; //獲取時間的時
select to_char(sysdate,'mi') as nowMinute from al; //獲取時間的分
select to_char(sysdate,'ss') as nowSecond from al; //獲取時間的秒
select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from al// 2.
select to_char( to_date(222,'J'),'Jsp') from al
顯示Two Hundred Twenty-Two 3.求某天是星期幾
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from al;
星期一
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from al;
monday
設置日期語言
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
也可以這樣
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 4. 兩個日期間的天數
select floor(sysdate - to_date('20020405','yyyymmdd')) from al; 5. 時間為null的用法
select id, active_date from table1
UNION
select 1, TO_DATE(null) from al;
注意要用TO_DATE(null) 6.月份差
a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')
那麼12月31號中午12點之後和12月1號的12點之前是不包含在這個范圍之內的。
所以,當時間需要精確的時候,覺得to_char還是必要的
7. 日期格式沖突問題
輸入的格式要看你安裝的ORACLE字元集的類型, 比如: US7ASCII, date格式的類型就是: '01-Jan-01'
alter system set NLS_DATE_LANGUAGE = American
alter session set NLS_DATE_LANGUAGE = American
或者在to_date中寫
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from al;
注意我這只是舉了NLS_DATE_LANGUAGE,當然還有很多,
可查看
select * from nls_session_parameters
select * from V$NLS_PARAMETERS 8.
select count(*)
from ( select rownum-1 rnum
from all_objects
where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-
02-01','yyyy-mm-dd')+1
)
where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )
not in ( '1', '7' )
查找2002-02-28至2002-02-01間除星期一和七的天數
在前後分別調用DBMS_UTILITY.GET_TIME, 讓後將結果相減(得到的是1/100秒, 而不是毫秒). 9. 查找月份
select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1
select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
1.03225806451613
10. Next_day的用法
Next_day(date, day)
Monday-Sunday, for format code DAY
Mon-Sun, for format code DY
1-7, for format code D 11
select to_char(sysdate,'hh:mi:ss') TIME from all_objects
注意:第一條記錄的TIME 與最後一行是一樣的
可以建立一個函數來處理這個問題
create or replace function sys_date return date is
begin
return sysdate;
end;
select to_char(sys_date,'hh:mi:ss') from all_objects;
12.獲得小時數
extract()找出日期或間隔值的欄位值
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer
SQL> select sysdate ,to_char(sysdate,'hh') from al;
SYSDATE TO_CHAR(SYSDATE,'HH')
-------------------- ---------------------
2003-10-13 19:35:21 07
SQL> select sysdate ,to_char(sysdate,'hh24') from al;
SYSDATE TO_CHAR(SYSDATE,'HH24')
-------------------- -----------------------
2003-10-13 19:35:21 19
13.年月日的處理
select older_date,
newer_date,
years,
months,
abs(
trunc(
newer_date-
add_months( older_date,years*12+months )
)
) days
from ( select
trunc(months_between( newer_date, older_date )/12) YEARS,
mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS,
newer_date,
older_date
from (
select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date
from emp
)
) 14.處理月份天數不定的辦法
select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from al 16.找出今年的天數
select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from al 閏年的處理方法
to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' )
如果是28就不是閏年 17.yyyy與rrrr的區別
'YYYY99 TO_C
------- ----
yyyy 99 0099
rrrr 99 1999
yyyy 01 0001
rrrr 01 2001 18.不同時區的處理
select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate
from al; 19.5秒鍾一個間隔
Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')
from al 2002-11-1 9:55:00 35786
SSSSS表示5位秒數 20.一年的第幾天
select TO_CHAR(SYSDATE,'DDD'),sysdate from al
310 2002-11-6 10:03:51 21.計算小時,分,秒,毫秒
select
Days,
A,
TRUNC(A*24) Hours,
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds
from
(
select
trunc(sysdate) Days,
sysdate - trunc(sysdate) A
from al
)
select * from tabname
order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');
//
floor((date2-date1) /365) 作為年
floor((date2-date1, 365) /30) 作為月
d(mod(date2-date1, 365), 30)作為日. 23.next_day函數 返回下個星期的日期,day為1-7或星期日-星期六,1表示星期日
next_day(sysdate,6)是從當前開始下一個星期五。後面的數字是從星期日開始算起。
1 2 3 4 5 6 7
日 一 二 三 四 五 六
---------------------------------------------------------------
select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from dal
日期 返回的是天 然後 轉換為ss
24,round[舍入到最接近的日期](day:舍入到最接近的星期日)
select sysdate S1,
round(sysdate) S2 ,
round(sysdate,'year') YEAR,
round(sysdate,'month') MONTH ,
round(sysdate,'day') DAY from al 25,trunc[截斷到最接近的日期,單位為天] ,返回的是日期類型
select sysdate S1,
trunc(sysdate) S2, //返回當前日期,無時分秒
trunc(sysdate,'year') YEAR, //返回當前年的1月1日,無時分秒
trunc(sysdate,'month') MONTH , //返回當前月的1日,無時分秒
trunc(sysdate,'day') DAY //返回當前星期的星期天,無時分秒
from al 26,返回日期列表中最晚日期
select greatest('01-1月-04','04-1月-04','10-2月-04') from al 27.計算時間差
注:oracle時間差是以天數為單位,所以換算成年月,日
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from al //時間差-年
select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from al //時間差-月
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from al //時間差-天
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from al //時間差-時
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from al //時間差-分
select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from al //時間差-秒 28.更新時間
注:oracle時間加減是以天數為單位,設改變數為n,所以換算成年月,日
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from al //改變時間-年
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from al //改變時間-月
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from al //改變時間-日
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from al //改變時間-時
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from al //改變時間-分
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from al //改變時間-秒 29.查找月的第一天,最後一天
SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
FROM al;
Ⅳ SQL,要將自動訂單編號設為一位用戶ID,接上當時的時間作為訂單編號,該怎樣設置呢
insert into 表名(OrderID)values (convert(varchar(10),ID)+convert(varchar(8),getdate(),112)+replace(convert(varchar(5),getdate(),108),':',''))
Ⅵ SQL中如何格式轉換當前時間
sql server2000中使用convert來取得datetime數據類型樣式(全)
日期數據格式的處理,兩個示例:
CONVERT(varchar(16), 時間一, 20) 結果:2007-02-01 08:02/*時間一般為getdate()函數或數據表裡的欄位*/
CONVERT(varchar(10), 時間一, 23) 結果:2007-02-01 /*varchar(10)表示日期輸出的格式,如果不夠長會發生截取*/
語句及查詢結果:
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
Select CONVERT(varchar(100), GETDATE(), 12): 060516
Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112): 20060516
Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM
說明:
使用 CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
參數
expression
是任何有效的 Microsoft® SQL Server™ 表達式。。
data_type
目標系統所提供的數據類型,包括 bigint 和 sql_variant。不能使用用戶定義的數據類型。
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 Server 支持使用科威特演算法的阿拉伯樣式中的數據格式。
在表中,左側的兩列表示將 datetime 或 smalldatetime 轉換為字元數據的 style 值。給 style 值加 100,可獲得包括世紀數位的四位年份 (yyyy)。
不帶世紀數位 (yy) 帶世紀數位 (yyyy)
標准
輸入/輸出**
- 0 或 100 (*) 默認值 mon dd yyyy hh:miAM(或 PM)
1 101 美國 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英國/法國 dd/mm/yy
4 104 德國 dd.mm.yy
5 105 義大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默認值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美國 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 歐洲默認值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 規范 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 規范(帶毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss.mmm(不含空格)
- 130* Hijri**** dd mon yyyy hh:mi:ss:mmmAM
- 131* Hijri**** dd/mm/yy hh:mi:ss:mmmAM
* 默認值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始終返回世紀數位 (yyyy)。
** 當轉換為 datetime時輸入;當轉換為字元數據時輸出。
*** 專門用於 XML。對於從 datetime或 smalldatetime 到 character 數據的轉換,輸出格式如表中所示。對於從 float、money 或 smallmoney 到 character 數據的轉換,輸出等同於 style 2。對於從 real 到 character 數據的轉換,輸出等同於 style 1。
****Hijri 是具有幾種變化形式的日歷系統,Microsoft® SQL Server™ 2000 使用其中的科威特演算法。
重要 默認情況下,SQL Server 根據截止年份 2049 解釋兩位數字的年份。即,兩位數字的年份 49 被解釋為 2049,而兩位數字的年份 50 被解釋為 1950。許多客戶端應用程序(例如那些基於 OLE 自動化對象的客戶端應用程序)都使用 2030 作為截止年份。SQL Server 提供一個配置選項("兩位數字的截止年份"),藉以更改 SQL Server 所使用的截止年份並對日期進行一致性處理。然而最安全的辦法是指定四位數字年份。
當從 smalldatetime 轉換為字元數據時,包含秒或毫秒的樣式將在這些位置上顯示零。當從 datetime 或 smalldatetime 值進行轉換時,可以通過使用適當的 char 或 varchar 數據類型長度來截斷不需要的日期部分。
來源: http://www.cnblogs.com/Gavinzhao/archive/2009/11/10/1599690.html