我有一個這種格式的表
| 從 | 到 | 開始日期 |
|---|---|---|
| 乙 | 一種 | 1220201 |
| C | 一種 | 1220301 |
| 乙 | 一種 | 1220102 |
| 一種 | 乙 | 1220201 |
| C | 乙 | 1220301 |
| 一種 | 乙 | 1220101 |
日期格式的格式如下:1yymmdd
我想要的是為每個From和To夫婦(每個示例A/ B)創建一個Begin_Date和End_Date(基于下一個Begin_Date)與 Format dd.mm.yy。
我已經有了它,Begin_date因為它是用戶給出的值。現在,對于End_Date,我必須檢查是否有Begin_date比我的 from/to 夫婦更大的。
例如,對于A/ B:
| 從 | 到 | 開始日期 |
|---|---|---|
| 一種 | 乙 | 01.02.2022 |
| 一種 | 乙 | 01.01.2022 |
它應該給我這樣的東西(我想要的結果是所有從/到對的結果):
| 從 | 到 | 開始日期 | 結束日期 |
|---|---|---|---|
| 一種 | 乙 | 01.02.2022 | 空值 |
| 一種 | 乙 | 01.01.2022 | 31.01.2022 |
該值End_date是31.01.2022因為這對 ( 01.02.2022) 的值更大,并且比該值早一天。
如果沒有更大的Begin_date,我只想寫null。
你能幫我做這件事嗎?我找不到這個用例的可行解決方案。
uj5u.com熱心網友回復:
您應該考慮將日期存盤在 Date Column 中,而不是 varchar 列中。
也許這就是你所追求的?
select t.[From],
t.[To],
convert(date, right(t.Begin_Date, 6)) as BeginDate,
t2.BeginDate as EndDate
from table1 t
outer apply ( select top 1
dateadd(day, -1, convert(date, right(t1.Begin_Date, 6))) as BeginDate
from table1 t1
where t1.[From] = t.[From]
and t1.[To] = t.[To]
and convert(date, right(t1.Begin_Date, 6)) > convert(date, right(t.Begin_Date, 6))
order by convert(date, right(t1.Begin_Date, 6))
) t2
單擊此鏈接可在 DBFiddle 中查看
如果這不是您想要的,那么請嘗試更詳細地解釋
| 從 | 到 | 開始日期 | 結束日期 |
|---|---|---|---|
| 乙 | 一種 | 2022-02-01 | |
| C | 一種 | 2022-03-01 | |
| 乙 | 一種 | 2022-01-02 | 2022-01-31 |
| 一種 | 乙 | 2022-02-01 | |
| C | 乙 | 2022-03-01 | |
| 一種 | 乙 | 2022-01-02 | 2022-01-31 |
uj5u.com熱心網友回復:
您可以使用lead()orlag()獲取下一個/上一個值,然后dateadd()從中減去一天。
您的日期格式1YYMMDD轉換date為CROSS APPLY
select *,
EndDate = dateadd(day, -1, lead(b.BeginDate) over (partition by t.[From], t.[To]
order by b.BeginDate) )
from tbl t
cross apply
(
select BeginDate = convert(date, '20' right(t.[Begin_Date], 6))
) b
order by t.[From], t.[To], b.[BeginDate]
db<>小提琴演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/474580.html
上一篇:T-SQL從XML中獲取值
下一篇:根據條件匹配并設定孩子的ID
