2009-02-03 68 views
1

我怎樣才能將年份(例如0852或200852)轉換爲日期(例如2008-12-31或特定爲一週的結束日期,即2008-12-27星期六或一個星期開始日期,即2008-12 -21)? 星期五,星期六,星期天或星期一的任何一天都會結束。如何將一週(200851)轉換爲日期(2008-12-27)?

+0

你在哪個數據庫上? – 2009-02-03 12:12:17

回答

3

MS SQL Server有DATEADD functionallity應該幫助...

DECLARE @date_string NCHAR(6) 
SELECT @date_string = N'200852' 

SELECT DATEADD(
      WEEK, 
      CAST(RIGHT(@date_string, 2) AS INT), 
      DATEADD(
       YEAR, 
       CAST(LEFT(@date_string, 4) AS INT) - 1900, 
       0 
      ) 
     ) 

編輯:

對不起,錯過了一些關於使其成爲一個週六,等...

一旦你的價值,使用DATEPART得到它是什麼日子的一週,並減去從你的答案......

DECLARE @new_date DATETIME 
SELECT @new_date = '2008 Dec 30' 

SELECT DATEADD(DAY, 1-DATEPART(dw, @new_date), @new_date) 

這會將值帶到一週的開始,具體取決於您設置的DATEFIRST。

1

在Oracle:

SELECT TO_DATE('04.01.' || SUBSTR(iso, 1, 4)) + (TO_NUMBER(SUBSTR(iso, 5, 2))) * 7 - TO_CHAR(TO_DATE('04.01.' || SUBSTR(iso, 1, 4)), 'D') 
FROM (
    SELECT '200101' AS iso 
    FROM dual 
    ) 
1

如果這是在Oracle中,檢查出TO_DATE函數與各種選項,YYYYWW。 從雙重選擇TO_Date('200852'YYYYWW);

http://www.oradev.com/oracle_date_format.jsp 一旦你得到了一週的開始,你總是可以添加天數來獲得週末日期。

2

日期函數幾乎是數據庫特定的。比如在MySQL中,你可以做以下的 'YYYYWW' 格式獲得一週的星期一:

select date_sub(makedate(left('YYYYWW', 4), 1 + (right('YYYYWW', 2) - 1) * 7), 
interval weekday(makedate(left('YYYYWW', 4), 1 + (right('YYYYWW', 2) - 1) * 7)) DAY); 

隨着MAKEDATE(左( 'YYYYWW',4),1 +(右( 'YYYYWW' ,2) - 1)* 7)你會得到一個肯定在給定的周和年的日期,並且使用date_sub函數我們會回到那周的星期一。

例子:

  • 爲 '200906' 將返回「2009-02-02
  • 爲 '200901',就返回 '2008-12-29'(其實這是的星期一2009年第1周)
4

這是一個幾乎與數據庫無關的解決方案,如果這很重要的話。

創建一個名爲ALMANAC的表,主鍵爲DATE,該表列出您計劃使用的日期的所有屬性。其中一個可能是年,另一個可能是周。您可以包含您想要使用的DATE的任何可計算功能。您還可以包括公司特定的DATE屬性,如日期是否爲公司假期。

寫一個程序來填充日期爲10年(大約3650行加上一些閏年)。該程序將使用某些編程語言的DBMS中可用的環境特定日期函數。一旦你填充了ALMANAC表,就像普通數據一樣使用它。加入數據庫中任何日期字段的主鍵。

事實證明,這對於按照周,按月,按季度和按年自動準備報告這樣的事情非常有用。

如果DATE的粒度不夠細,您甚至可以將年曆分成更小的時間單位,如3班是一天的班次。