2013年7月16日 星期二

計算兩個日期差距幾天-sql server版本



如果欄位並非日期格式的話 要先轉換成日期格式
CONVERT(datetime,日期欄位1),CONVERT(datetime,日期欄位2)
然後再將轉換好的丟進去做運算
DATEDIFF(datepart ,startdate,enddate)

所以結合一下 就可以寫成下面的方式
DATEDIFF (day,CONVERT(datetime,日期欄位1),CONVERT(datetime,日期欄位2))

備註 參數的部份 可以替換
日期部分
縮寫
yy、yyyy
qq、q
mm、m
一年當中的第幾天
dy、y
dd、d
wk、ww
星期幾
dw
hh
mi、n
ss、s
毫秒
ms



--------------------ASP .NET 日期相減問題--------------------------
ASP .NET VB


      Dim a As String = "0950807"
       Dim b As String = "0700925"
       Dim c As String = (Mid(a, 1, 3) + 1911) & "/" & Mid(a, 4, 2) & "/" & Mid(a, 6, 2)
       Dim d As String = (Mid(b, 1, 3) + 1911) & "/" & Mid(b, 4, 2) & "/" & Mid(b, 6, 2)
       Dim Day As Integer = (DateValue(c) - DateValue(d)).Days
       Dim YMD As Date = DateValue("0001/12/31").AddDays(Day).AddYears(-2).Date
       Response.Write("相差" & Day & "天
")
       Response.Write("相差" & YMD.Year & "年" & YMD.Month & "月" & YMD.Day & "日")
       Response.Write("
")
       Response.Write(Format(YMD, "yyyy/MM/dd"))


資料來源: http://www.blueshop.com.tw/board/.../BRD200608071555506PL.html


在 Transact-SQL 的預設日期 DATETIME 格式是 yyyy-mm-dd hh:mm:ss.mmm



在 Transact-SQL 的預設日期 DATETIME 格式是 yyyy-mm-dd hh:mm:ss.mmm

例如:

SELECT GETDATE()
=> 2007-12-31 10:30:20.517

而在程式中常常需要日期的處理,尤其是什麼只要日期不要時間啊,只要時間不要日期啊,或是日期的 Format 等等,為了省掉在程式上撰寫轉換函數,這裡有些些 Transact-SQL 常用到的日期時間格式轉換,方法如下:

SELECT CONVERT(VARCHAR(18) , getdate(), 100)
=> 12 31 2007 10:30AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 101 )
=> 12/31/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 102 )
=> 2007.12.31

SELECT CONVERT(VARCHAR(10) , GETDATE(), 103 )
=> 31/12/2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 104 )
=> 31.12.2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 105 )
=> 31-12-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 106 )
=> 31 12 2007

SELECT CONVERT(VARCHAR(11) , GETDATE(), 107 )
=> 12 31, 2007

SELECT CONVERT(VARCHAR(8) , GETDATE(), 108 )
=> 10:30:20

SELECT CONVERT(VARCHAR(25) , GETDATE(), 109)
=> 12 31 2007 10:30:20:517AM

SELECT CONVERT(VARCHAR(10) , GETDATE(), 110 )
=> 12-31-2007

SELECT CONVERT(VARCHAR(10) , GETDATE(), 111 )
=> 2007/12/31

SELECT CONVERT(VARCHAR(8) , GETDATE(), 112 )
=> 20071231

SELECT CONVERT(VARCHAR(23) , GETDATE(), 113 )
=> 31 12 2007 10:30:20:517

SELECT CONVERT(VARCHAR(12) , GETDATE(), 114 )
=> 10:30:20:517

SELECT CONVERT(VARCHAR, GETDATE(), 120 )
=> 2007-12-31 10:30:20

最後
SELECT REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120 ),'-',''),' ',''),':','')
=> 20071231103020
這個適合作為流水帳號,在同一秒不query兩次的前提下是個產生不重複值的好方法

不受時間限制,也可以用 NEWID()
select newid()




如果在我的資料庫...即有的欄位【transdate】...
其日期的格式是「20080402」...
如果我想要把他轉成『2008/04/02』...

CONVERT(DATETIME,'20080402')
就能將字串'20080402'變成日期

所以 SELECT CONVERT(VARCHAR(10), CONVERT(DATETIME, '20080402'), 111) 就能將字串'20080402'變成字串'2008/04/02'

資料來源:
http://skyerh.blogspot.com/2007/12/sql-convert.html
http://blog.makk.idv.hk/tsql_datetime_format/


[SQL]如何將字串yyyyMMddHHmmss轉成Datetime呢?



DECLARE @DateTimeVaue VARCHAR(30)
SET @DateTimeVaue = '20130402140837' -- 2013/04/02 14:08:37

--使用字串函數先將字串轉成日期格式字串再轉成DateTime (20130402140837 => 20130402 14:08:37)
SELECT  CONVERT(DATETIME, LEFT(@DateTimeVaue, 8) + ' '
       + SUBSTRING(@DateTimeVaue, 9, 2) + ':'
+ SUBSTRING(@DateTimeVaue, 11, 2) + ':'
       + RIGHT(@DateTimeVaue, 2), 112)

--使用DATEADD來將時間加總
SELECT  DATEADD(s, CAST(RIGHT(@DateTimeVaue, 2) AS INT),
               DATEADD(n, CAST(SUBSTRING(@DateTimeVaue, 11, 2) AS INT),
                       DATEADD(hh,
                               CAST(SUBSTRING(@DateTimeVaue, 9, 2) AS INT),
                               CONVERT(DATETIME, LEFT(@DateTimeVaue, 8), 112))))



資料來源:http://www.dotblogs.com.tw/rainmaker/archive/2013/04/03/99823.aspx

日期轉換(西元<-->民國)

日期轉換方式有很多種寫法,在此介紹比較簡單易懂且常用的方式︰
1.先把日期去掉("/" or "-" or ".")等符號,轉成字串形態(yyyymmdd or yymmdd),接著在相加或相減19110000
 〔EX: 2012/08/05 or 2012-08-05  2012.08.05 ==>20120805 註︰月及日一定要各兩碼,不足前面補0
  西元(yyyymmdd)轉民國
  date1="20120805" - 19110000    date1 輸出︰1010805
   
  民國轉西元(yyyymmdd)
  date2=19110000 + "1010805"     date2 輸出︰20120805

2.只針對年份做相加或相減1911,且可保有("/" or "-" or ".")等符號
 
  西元轉民國  (PS:假設今日NOW()為 2012/12/22)
  date3=year(now())-1911 & mid(FormatDateTime(now(),2),5)      date3 輸出︰101/12/22
  民國轉西元
  strDate = "101/12/22"
  DateArr = Split(strDate, "/")
  date4=Cint(DateArr(0))+1911 & mid(strDate,len(DateArr(0))+1)   date4 輸出︰2012/12/22
 
通常若要做日期比較或運算建議採用第一種寫法,若要顯示於螢幕上或報表上建議採用第二種方式
總之不管採用任何哪一種方式,都可以達到所要的結果,只是多一個步驟或少一個步驟而已。
〔如第一種寫法產生結果也可以像第二種產生結果一樣,需多加個拆解及合併動作,反之亦然〕