# 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}]"}