Как конвертировать неделю (200851) в дату (2008-12-27)? - PullRequest
2 голосов
/ 03 февраля 2009

Как я могу преобразовать год-неделю (например, 0852 или 200852) в дату (например, 2008-12-31 или, в частности, день окончания недели, например, суббота 2008-12-27, или день начала недели, т.е. 12-21) Подойдет любой день выходного дня: пятница, суббота, воскресенье или понедельник.

Ответы [ 5 ]

5 голосов
/ 03 февраля 2009

MS SQL SERVER имеет функцию DATEADD, которая должна помочь ...

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
           )
       )

EDIT:

Извините, пропустил немного о том, чтобы сделать его субботой и т.д ...

Получив значение, используйте DATEPART, чтобы узнать, какой сегодня день недели, и вычтите это из своего ответа ...

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

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

Это приведет к значению начала недели, в зависимости от того, что вы установили для DATEFIRST.

4 голосов
/ 03 февраля 2009

Вот решение, которое практически не зависит от базы данных, если это важно.

Создайте таблицу с именем ALMANAC, первичный ключ DATE, в которой перечислены все атрибуты даты, которую вы планируете использовать. Одним из них может быть ГОД, другим может быть НЕДЕЛЯ. Вы можете включить любые вычислимые функции DATE, которые вы хотите часто использовать. Вы также можете включить специфичные для компании атрибуты DATE, например, является ли дата выходным днем ​​компании.

Напишите одну программу для заполнения DATE, скажем, на 10 лет (около 3650 строк плюс несколько високосных лет). Эта программа будет использовать функции дат для конкретной среды, доступные вам в СУБД или на некотором языке программирования. Заполнив таблицу ALMANAC, используйте ее как обычные данные. Соедините первичный ключ с любыми полями даты в вашей базе данных.

Это оказывается чрезвычайно полезным для выполнения таких задач, как подготовка отчета по неделям, месяцам, кварталам и по годам почти автоматически.

Если ДАТА не достаточно точная, вы можете даже разделить Альманах на более мелкие единицы времени, например смены, где 3 смены - это один день.

2 голосов
/ 03 февраля 2009

Функции даты в значительной степени зависят от базы данных. Например, в 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 голос
/ 03 февраля 2009

Если это в Oracle, проверьте функцию TO_Date с различными опциями, YYYYWW. выберите TO_Date ('200852' YYYYWW) из двойного;

http://www.oradev.com/oracle_date_format.jsp Получив начало недели, вы всегда можете добавить количество дней, чтобы узнать дату выходных.

1 голос
/ 03 февраля 2009

В 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
    )
...