# SQL 內日期時間處理 ## 時間是否為空用 NULL 判斷 檢查 SQL 的時間是否為空請用 NULL 判斷,不要用 '' ## 輸入日期時盡量不要用 - dash 符號 操作 MS SQL Server 時,即使使用 values(convert(datetime, '時間字串') 也會有轉型失敗的時候,如下: - 僅輸入年月日時使用 dash 會被當作字串,例如 2021-01-21,無法轉換 - 在年月日與時間中插 dash 會被當作字串,例如 2021-01-21 10:53:00,無法轉換 這種時間寫法在 SQL 2000~低於2008 的版本會無法轉換,然而多加個 T 就可以,例如: - YYYY-MM-DD**T**HH:MM:SS 在 2008 以上的版本,雖然 datetime 仍不支援,但可以轉型為 datetime2 > SELECT > CAST('02-21-2012 6:10:00 PM' AS DATETIME2), > CAST('01-01-2012 12:00:00 AM' AS DATETIME2) 總結來說,如果 DB 支援 DATETIME2 就盡量使用 DATETIME2,問題比較少 [Conversion failed when converting date and/or time from character string while inserting datetime](https://stackoverflow.com/questions/14119133/conversion-failed-when-converting-date-and-or-time-from-character-string-while-i) ## 為了塞入資料庫而轉型為 java.sql.Timestamp 或 java.sql.Date Java 處理時間很常用到 java.util.Date,然而它無法被直接塞到資料庫內 util.Date 有 3 個子類:java.sql.Date、java.sql.Time,java.sql.Timestamp 它們都可用來處理輸入 SQL 的需求,所以想要輸入 DB,我們就要先想辦法將 util.Date 轉為 java.sql 下的子類 轉完就可使用 preparedStatement 的 setDate、setTime、setTimestamp 等方法來輸入 DB ### 三種 set時間 方法 setDate = 設定年月日而已,無時間 setTime = 聽說是只設定時間,基本上不太用 setTimestamp = 設定時間戳記,年月日時間都有 ### util.Date 轉 Timestamp 差不多是這種感覺 `preparedStatement.setTimestamp(1, new java.sql.Timestamp(new java.util.Date().getTime()));` 先在 Date 使用 getTime() 可以得到 long 值,然後拿去 new 成 Timestamp ### String 轉 Timestamp 使用 Timestamp 的 valueOf() 方法 ``` Timestamp timestamp = new Timestamp(System.currentTimeMillis()); String dateString = "2011-05-09 11:49:45"; timestamp = Timestamp.valueOf(timeFormat); **String 的必须形如: yyyy-mm-dd hh:mm:ss[.f...],其中 [.f...] 非必要,使用方式要另外查** ``` ### String 轉 Date 最經典的... > String dateString = "2010/05/04 12:34:23"; > DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); > **為避免出錯,日期字串可盡量與格式對齊** > Date date = sdf.parse(dateString); [Java:String和Date、Timestamp之间的转换](https://blog.csdn.net/oChangWen/article/details/54561631) ###### tags: `SQL` `Java`
{"metaMigratedAt":"2023-06-15T18:47:32.183Z","metaMigratedFrom":"Content","title":"SQL 內日期時間處理","breaks":true,"contributors":"[{\"id\":\"43986918-a98b-4cf0-8930-28ae09faf9a0\",\"add\":2099,\"del\":147}]"}
Expand menu